在 echo 語句中使用百分號 (%) 與變數的 IF 條件檢定位於同一行

在 echo 語句中使用百分號 (%) 與變數的 IF 條件檢定位於同一行

我正在嘗試在批處理文件中使用這一行

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

當我運行它時我得到這個

) was unexpected at this time.

C:\>      If NOT "ARGUMENTBARUSERPROFILE\Desktop\Log File.txt")

(ARGUMENT = 我在運行批次檔時使用的任何參數/參數)

我嘗試了各種變體,包括將“Log File.txt”更改為“LogFile.txt”並刪除路徑周圍的引號,並將範圍縮小到只要有跡象 %(從嘗試回顯)它就會中斷的事實變數)或冒號(從右側的路徑>>)。我不知道冒號問題是什麼,但它%似乎是貪婪的,讀取該行意味著正在測試的變數是一對所包含的所有內容的整個串聯字串 %加上該行的其餘部分(大概是因為之後沒有運算符,因此它會持續到EOL,在那裡它會遇到括號)。所以看來要嘛需要轉義某些東西,要嘛我需要改變其他東西,要嘛這是不可能的。

我意識到我可以簡單地將 echo 語句放在另一行上,如下所示

If NOT... (
  echo...
)

但我寧願用一行來完成,部分原因是它更乾淨,但主要是因為我很好奇並且喜歡弄清楚這樣的事情,而我討厭當我不能時。

順便說一句,延遲表達已啟用。

編輯:根據@AFH的評論,我在批次文件中對其進行了測試,發現這

@echo on
setlocal enableDelayedExpansion
SET bar=test
If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

沒有給出錯誤,但放置任何事物在它之後(例如,endlocal在下一行,甚至在下一行空白處)。然而,使用%1而不是%1%ADH 提到的,確實修復了它,所以這就是問題所在。因此這個問題就解決了。

答案1

我無法重現您的確切錯誤,但我可以確認AFH的觀察命令列參數是(例如 ,,等)而不是,所以你的命令應該是%n%1%2%n%

If NOT "%1"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")

我相信我可以闡明當您添加額外的內容時會發生什麼 %。 CMD 似乎在執行其他操作之前先解析命令列中的參數和變量,並且它使用了一個非常簡單的解析器。當它遇到一個 %,

  • 如果下一個字元是數字,則它是位置參數;%n
  • 如果是其他東西,那就是變數 ( ),並且%name%一切直到下一個%name。我想如果沒有匹配的話,它會變得非常混亂%

下面是你的命令的解析方式:

If NOT "%1%"=="foo" (echo %bar% Text. >> "%USERPROFILE%\Desktop\Log File.txt")
        \/\---------------/   \-----------/           \---------------------- ...?

它認為"=="foo" (echo  Text. >> "是變數名,而barUSERPROFILE是文字文字。例如,使用參數“hello”運行命令會產生與您得到的類似的錯誤訊息:

命令的語法不正確。
 
C:(目前目錄)> 如果不是「hellobarUSERPROFILE\Desktop\Log File.txt」)

相關內容