2009-11-07 184 views
6

我不知道如何描述我正在嘗試做什麼,但這裏是一個示例批處理文件,演示了我無法弄清楚的事情:如何將環境變量設置爲批處理文件中的空格值?

我有一個批處理文件。內部的批處理文件,我試圖創建一個目錄:

Set CopyFrom = %~dp0 

if Exist "%ProgramFiles(x86)" (
    Set TargetDir = %ProgramFiles(x86)%\My Directory Name has spaces 
) 

md %TargetDir%\NewSubFolder 
copy %CopyFrom%\SourceFile.zip %TargetDir%\NewSubFolder 

我的批處理文件第4行Set TargetDir =...與失敗:

\My was unexpected at this time 

我假設這是因爲我有我的空間路徑名稱。我想我可能只是換我的變量與報價:

Set TargetDir = "%ProgramFiles(x86)%\My Directory Name has spaces" 

但是當我去創建它失敗,因爲%TargetDir%現在包裹在引號中的目錄就行了。 md "%TargetDir%"\NewSubFolder

這可以修復嗎?或者我應該寫一個VBScript來解決問題嗎?

回答

6

只要把你的表達引號是這樣的:

C:\>Set "TargetDir=%ProgramFiles%\My Directory Name has spaces" 
C:\>echo %TargetDir% 
C:\Program Files\My Directory Name has spaces 

注:將擴大該變量的引號內,如果它也有空間,它需要被引用。

現在你可以給它來執行你的操作:

md "%TargetDir%\NewSubFolder" 
+0

謝謝,這只是票,非常感謝。 – BobTheBuilder 2009-11-07 21:42:36

+0

從來沒有想過我可以將整個項目包在引號之後......當然,這不完全直觀嗎? – BobTheBuilder 2009-11-07 21:43:44

+0

不,不直觀。 (沒有太多關於Windows命令行 - 這就是爲什麼我切換到PowerShell)。我認爲它是這樣的:「=」的兩邊是set命令的單個參數。 – zdan 2009-11-07 23:03:04

2

問題這裏的問題是的空間爲其他人則建議,而是在環境變量ProgramFiles(x86)右括號這將導致解析器認爲該塊過早結束(shameless self-promotion)。

行情幫助在這種情況下,因爲他們使解析器跳過整個引用的部分,並正確地假定下面的括號是實際關閉的一個。但修復可能比這更簡單:

if Exist "%ProgramFiles(x86)%" Set TargetDir=%ProgramFiles(x86)%\My Directory Name has spaces 

爲什麼要使用一個括號塊在所有如果你做到這一點恰好放一個命令成嗎?

set本身並不需要任何報價,除了當它的參數包含像<>|&其外殼本身AREADY處理特殊字符。這不是萬能的,儘管這使得正確處理用戶輸入或文件內容有時會很痛苦。

另外,千萬不要在=set命令中輸入空格。這將導致創建一個環境變量,其名稱名稱以空格結尾,其內容以空格開頭。

> set foo = bar 
> set foo 
foo=bar 
foo = bar 

但在Windows中,這個以前的版本並沒有發生,所以從來沒有使用=,除非周圍的空間:這是部分在Windows 7中通過不默默地既創造,並在後面的空間變量和一個修正你知道這是你想要的:-)

相關問題