我想這樣做在一個命令:命令行變量的延遲擴展
set myvar="hello" && echo %myvar%
,並得到「你好」在屏幕上。 但我得到%myvar%。這個擴展如何立即完成,所以我得到「你好」?
編輯: 如何看待用尖括號時,如:
set "var=<hello>"& echo %^var%
我想這樣做在一個命令:命令行變量的延遲擴展
set myvar="hello" && echo %myvar%
,並得到「你好」在屏幕上。 但我得到%myvar%。這個擴展如何立即完成,所以我得到「你好」?
編輯: 如何看待用尖括號時,如:
set "var=<hello>"& echo %^var%
選項1 - 使用CALL獲得額外的一輪擴展
CALL命令引入了一輪額外的擴展。但是你不希望變量在執行CALL之前被擴展,否則你會得到在執行該行之前存在的值(假設它已經存在)。所以你需要一種方法來延緩擴張。
在批處理腳本中,您可以使用call echo %%myvar%%
,但在命令行上不能使用加倍百分比。
讓它在命令行上工作的訣竅是在名稱中引入消失的脫字符號。正常擴展將插入符號解釋爲名稱的一部分,因此找不到該變量,並且沒有任何擴展。脫字符號在CALL擴展之前被消耗,因此可以獲得正確的結果。
set "myvar=hello"&call echo %^myvar%
注意,這將不會在名爲^myvar
變量實際上存在萬一工作。
選項2 - 持久啓用延遲擴展
cmd /v:on
set "myvar=hello"&echo !myvar!
選項3 - 暫時啓用延遲擴展
set "myvar=hello"&cmd /v:on /c echo !myvar!
更新編輯疑問句重刑
如果您的變量包含毒物字符,如<
或>
,那麼你最好的選擇是使用選項2或3,因爲延遲擴展毒免疫字符。
您可以使用選項1的顯而易見的方法是如果您在定義過程中轉義毒性字符。
set "myvar=^<hello^>"&call echo %^myvar%
不是很實際的解決方案。
我想你可以做到以下幾點,以避免延遲擴展和避免修改內容:
set "myvar=<hello>"&for /f "delims=" %A in ('echo ^"%^myvar%^"') do @echo %~A
但是,這可能有問題,如果您的變量的內容可能有嵌入引號。
假設你想在命令行這樣做,因爲在一個批處理反對:
set myvar="hello" && call echo %myvar%
這隻適用於myvar在開始時未定義的情況。如果它已經被定義,則原始值被回顯。 – dbenham 2015-02-09 17:22:24
可以針對各種可能的情況進行此項工作,例如也爲echo%myvar:〜1,-1%,我想排除第一個和最後一個符號 – Sandra 2015-02-09 17:46:59
@Sandra - 當然。脫字符可以是開頭百分比和冒號之間的任何地方。試一試。 – dbenham 2015-02-09 17:49:31
你最近的意見,避免延期擴張,是不是應該設置myvar = 沒有逃脫?它究竟做了什麼? – Sandra 2015-02-10 15:05:08