2015-02-09 111 views
0

我想這樣做在一個命令:命令行變量的延遲擴展

set myvar="hello" && echo %myvar% 

,並得到「你好」在屏幕上。 但我得到%myvar%。這個擴展如何立即完成,所以我得到「你好」?

編輯: 如何看待用尖括號時,如:

set "var=<hello>"& echo %^var% 

回答

0

選項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 

但是,這可能有問題,如果您的變量的內容可能有嵌入引號。

+0

可以針對各種可能的情況進行此項工作,例如也爲echo%myvar:〜1,-1%,我想排除第一個和最後一個符號 – Sandra 2015-02-09 17:46:59

+0

@Sandra - 當然。脫字符可以是開頭百分比和冒號之間的任何地方。試一試。 – dbenham 2015-02-09 17:49:31

+1

你最近的意見,避免延期擴張,是不是應該設置myvar = 沒有逃脫?它究竟做了什麼? – Sandra 2015-02-10 15:05:08

0

假設你想在命令行這樣做,因爲在一個批處理反對:

set myvar="hello" && call echo %myvar% 
+0

這隻適用於myvar在開始時未定義的情況。如果它已經被定義,則原始值被回顯。 – dbenham 2015-02-09 17:22:24