2009-01-10 71 views
7

在Windows上的一些批處理文件使用IF語法與多條線路,如下圖所示:批處理文件,Vista 64位,如果和括號

if var==rule (
    some comands 
) else (
    else commands 
) 

現在的Windows Vista 64位決定把所有32個文件「C下:\ Program Files(x86)「。不幸的是,無論何時在沒有引號的多行IF中使用環境變量(如PATH),變量值中的括號都會混淆IF,從而中止批處理文件。例如:

if "%OS%"=="Windows_NT" (
    @setlocal 
    call :set_home 
    set _ARGS=%* 
) else (
    set _SCALA_HOME=%SCALA_HOME% 
    rem The following line tests SCALA_HOME instead of _SCALA_HOME, because 
    rem the above change to _SCALA_HOME is not visible within this block. 
    if "%SCALA_HOME%"=="" goto error1 
    call :set_args 
) 

與此批處理文件將失敗即使其中%SCALA_HOME出現%沒有得到執行行。這很煩人。有沒有解決方案?

回答

9

變化%SCALA_HOME%所有實例!SCALA_HOME!,並添加接近文件的頂部以下:

setlocal enableextensions enabledelayedexpansion 

上的「延遲變量擴展」,這意味着寫成如下形式!VAR!變量是後者匝直到它們被使用時才擴展,而不是在語句本身被解析時。 (以我有限的經驗,當然在這種情況下,這意味着變量擴展不太可能被誤解爲實際的批處理文件語法結構。)感謝Patrick Cuff在評論中指出了這種更好的方式。

P.S .:當你發現,cmd.exe批處理文件的語言是可怕的在許多方面破碎。如果你不能使用真正的腳本語言(例如,如果你的任務需要在其他計算機上執行),那麼我會認真推薦刪除一個快速完成這個工作的C/C++「腳本」,並將其編譯爲.EXE。

+1

如果延遲擴展確實解決了這個問題,那麼您不需要第二批腳本,只需在腳本的頂部放置`setlocal enableextensions enabledelayedexpansion`即可。 – 2009-01-10 11:54:28