簡體   English   中英

cmd 批處理變量行為不直觀

[英]cmd batch variable behavior is unintuitive

我正在使用 windows 10,通過命令提示符 window 運行批處理文件。

我可以讓事情發揮作用,但我不知道為什么它會起作用,或者為什么我不能做某些事情:

set "file_list=a1 a2"
for %%a in (%file_list%) do (
    echo %%a.py
)

這段小代碼有效。 我可以建立在它之上,但是

Q1:我想將變量 %%a 更改為 %%filename... 但這不起作用,我想知道是否可能保留了文件名。 所以我嘗試了 %%fname: 在這種情況下,我得到了錯誤:

%fname was unexpected at this time.

我可以從命令行進行設置並使用描述性變量名稱,但在循環時它似乎不起作用。 (我是用上面的 %file_list% 變量做到的?)那么為什么我只能將單個字符用於循環變量? 有什么辦法嗎?

Q1a。 這讓我認為循環索引變量與 set 命令中的變量是不同類型的變量。 那是對的嗎? 如果是這樣,是否有一個鏈接可以清楚簡潔地解釋差異?

Q2。 我注意到循環索引變量是 %%a,而不是 a 或 %a 或 %a%。 我永遠不會猜到這一點。 我看過的 web 網站剛剛說過,這樣做。 但我看不出任何解釋為什么,除了第一個百分比是逃避。 好的。 這並不能解釋什么。 它只是意味着“這就是你的做法”。 當我使用百分號時的錯誤信息很有趣。

set "file_list=a1 a2"
for %a in (%file_list%) do (
    echo %a.py
)

"file_list) was unexpected at this time."

所以我可以模糊地看到,也許某些東西沒有被正確地轉義。 為什么%a中的那個%需要轉義,所以變成了%%a?

元變量for A 必須由% (在命令提示符中)或%% (在批處理文件中)和單個字符(區分大小寫的字母)組成,例如%a%%a 您不能定義%filename%%filename
循環變量僅存在於相應for循環中。 不要將此類循環變量與全局可用的普通環境變量(例如%TEMP% )混淆。

這些東西用% -signs 標記:

  1. % -轉義(僅適用於批處理文件),因此%%表示一個文字% -sign;
  2. 命令行參數/參數(顯然僅適用於批處理文件),例如%1
  3. 立即擴展環境變量* ,如%TEMP%
  4. for元變量,例如%a (在命令提示符中)或%%a (在批處理文件中),它們特定於for命令,因此它們不存在於相關循環上下文之外;

% -escaping (1.) 發生在擴展元變量 (4.) 之前,因此實際上for命令接收一個循環變量,如%a
然后環境變量(3.)在命令提示符和批處理文件中的處理方式不同:前者按字面意思保留未定義的變量,后者刪除它們。
詳細的解析規則可以在這篇文章中找到,微軟(或 IBM?)以這種方式實現了這些規則,以便能夠區分不同的% -事物,所以最后是他們的決定,因此你有詢問他們確切的原因……


*) 還有一些類似延遲環境變量擴展的東西,但這使用了! - 標記變量的符號,例如!TEMP! , 這是在解析所有%符號表達式之后發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM