2017-06-14 78 views
4

我注意到在Windows批處理文件,即使你REM了%〜你的錯誤%〜在REM語句

For valid formats type CALL /? or FOR /? 
The syntax of the command is incorrect. 

爲什麼沒有註釋行被忽略?

@ ECHO OFF 
REM Blah blah blah 
REM %~ this will cause an error 
REM %%~ Double the fun, no error 
+0

直接在命令提示符下嘗試相同的註釋,你會看到沒有錯誤;這表明'%〜'部分與批處理文件的[命令行參數擴展](http://ss64.com/nt/syntax-args.html)真正相關... – aschipfl

+0

還可以嘗試以下操作:'rem %VAR:=';這將在命令提示符和批處理文件中失敗,因爲變量'var'已定義;這顯示錯誤與[環境變量擴展(子字符串替換)](http://ss64.com/nt/syntax-replace.html)相關聯... – aschipfl

回答

5

REM是類似於ECHO的命令。在命令提示符窗口rem /?中運行以獲取有關此命令的幫助。

Windows命令解釋程序首先像批處理文件中的所有其他行一樣解析此命令行,但以冒號開頭的那些行被解釋爲標籤行而不是命令行。

因此,單個%被解釋爲在之前的環境變量或批處理文件參數引用的開始。REM完全被執行。單個百分號被刪除,因爲在該命令行上沒有更多的百分號。

%~在命令行解析中被解釋爲無效的批處理文件參數引用。命令REM不評估其餘行對Windows命令解釋器無關緊要。首先命令行在命令上被獨立解析,然後命令由cmd.exe執行,無論命令是什麼。

刪除第一行@ ECHO OFF,可以看到每個命令行是如何在被Windows命令解釋器解析後執行的。以冒號開頭的行不會被解釋爲標籤行而不是命令行。

有關批處理腳本解析細節參見How does the Windows Command Interpreter (CMD.EXE) parse scripts?

實施例:

REM User name: %USERNAME% 
REM User profile directory: %USERPROFILE% 
REM Application data directory: %APPDATA% 
REM Batch arguments: %0 %* 
PAUSE 

變量引用,並在這些REM命令行批處理文件參數參考由環境的值替換的環境變量和運行此批處理文件的批處理文件參數在頂部沒有@ECHO OFF

4

(最初)發佈的代碼不會導致錯誤。 但這種意願:

REM %~ this will cause an error 

的原因是該參數擴展爲具有比意見和cmd.exe的更高的優先級將首先嚐試擴大和dequote這裏沒有給出說法%~

+0

你是對的,沒有錯誤。雖然我在錯誤的地方發現了一個錯誤,否則我不會問這個問題。現在有點困惑:) –

+0

@MrMysteryGuest - 產生上述錯誤的唯一方法是混淆一些如何將參數傳遞給腳本或子例程。但沒有更多的代碼,我不能多說。 – npocmaka

+0

謝謝。我正在刪除我的腳本字符,直到我沒有得到錯誤。我沒有嘗試從新的DOS窗口,這可能導致進一步的問題 –