diff --git a/modules/markup/external/external.go b/modules/markup/external/external.go
index 73bf7a327e7..5963a06d30a 100644
--- a/modules/markup/external/external.go
+++ b/modules/markup/external/external.go
@@ -10,6 +10,7 @@ import (
 	"io/ioutil"
 	"os"
 	"os/exec"
+	"runtime"
 	"strings"
 
 	"code.gitea.io/gitea/modules/log"
@@ -41,13 +42,24 @@ func (p *Parser) Extensions() []string {
 	return p.FileExtensions
 }
 
+func envMark(envName string) string {
+	if runtime.GOOS == "windows" {
+		return "%" + envName + "%"
+	}
+	return "$" + envName
+}
+
 // Render renders the data of the document to HTML via the external tool.
 func (p *Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte {
 	var (
-		bs       []byte
-		buf      = bytes.NewBuffer(bs)
-		rd       = bytes.NewReader(rawBytes)
-		commands = strings.Fields(p.Command)
+		bs           []byte
+		buf          = bytes.NewBuffer(bs)
+		rd           = bytes.NewReader(rawBytes)
+		urlRawPrefix = strings.Replace(urlPrefix, "/src/", "/raw/", 1)
+
+		command = strings.NewReplacer(envMark("GITEA_PREFIX_SRC"), urlPrefix,
+			envMark("GITEA_PREFIX_RAW"), urlRawPrefix).Replace(p.Command)
+		commands = strings.Fields(command)
 		args     = commands[1:]
 	)
 
@@ -79,7 +91,7 @@ func (p *Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]stri
 	cmd.Env = append(
 		os.Environ(),
 		"GITEA_PREFIX_SRC="+urlPrefix,
-		"GITEA_PREFIX_RAW="+strings.Replace(urlPrefix, "/src/", "/raw/", 1),
+		"GITEA_PREFIX_RAW="+urlRawPrefix,
 	)
 	if !p.IsInputFile {
 		cmd.Stdin = rd