2013-05-06 50 views
0

我有一個批處理文件,並且在批處理文件中,它在特定目錄中查找並保存到變量中,即第一個目錄/文件的名稱。這裏大概是我在做什麼:蝙蝠腳本for循環在CL上工作,但在雙擊時不起作用

FOR /d %%F IN (%INSTALL_DIR%\dir\*) DO (
    set NAME=%%~xnF 
    set NAME_DIR=%INSTALL_DIR%\dir\%NAME% 
    goto :break 
) 

當我從命令行運行它,它完美的工作,並且NAME_DIR得到正確的值。但是,當我雙擊文件時,NAME變量是空白的。 NANE_DIR因此被設置爲%INSTALL_DIR%\ dir。爲什麼會發生這種情況,我該如何解決這個問題?

更多的澄清,在命令行中,這是迴盪在什麼NAME和NAME_DIR等於:

NAME:  dir1.3.8 
NAME_DIR: D:\root\path\to\dir\dir1.3.8 

這是當雙擊了什麼是附和道:

NAME:  
NAME_DIR: D:\root\path\to\dir 
+0

'NAME_DIR'得到命令行的正確值?棒極了!請在'goto:break'行之前''回顯'NAME'和'NAME_DIR'的值,並在此輸出。 – Endoro 2013-05-06 21:59:39

+0

爲了更好的清晰度,我添加了它 – user972276 2013-05-06 22:42:52

+0

您在哪行代碼中加入了'echo'命令? – Endoro 2013-05-07 00:08:47

回答

2

什麼RaymondChen告訴我在評論中工作!我需要使用延遲擴展。其原因是windows執行for循環作爲一個單獨的指令,因此它在執行for循環之前一次填充所有變量。因爲我從來沒有在for循環之前設置NAME,所以它只會評估爲無。因此,NAME_DIR會取代%NAME%的空字符串。我注意到當我第一次在命令行上運行腳本時,它不起作用。我再次運行它,它工作。我一直在運行它,它每次都有效。那是因爲在運行for循環一次之後,變量被保存並且永遠不會改變。所以下次運行代碼時,變量不再是空白的,它具有正確的值。現在,當雙擊時,NAME變量在開始處爲空。執行for循環後,NAME的值將更新。腳本執行後,cmd窗口退出,變量的新值將丟失,並重新開始。這是新的代碼延遲擴展:

setlocal ENABLEDELAYEDEXPANSION 

FOR /d %%F IN (%INSTALL_DIR%\dir\*) DO (
    set NAME=%%~xnF 
    set NAME_DIR=%INSTALL_DIR%\dir\!NAME! 
    goto :break 
) 

我在SETLOCAL語句添加和更改%NAME%!NAME!