2013-01-05 111 views
2

我試圖用批處理腳本自動加載Putty Pageant與一些SSH密鑰,但是因爲我想繞過已經運行的Pageant的錯誤消息,所以我將它放在IF語句中。然而,對於某些原因,這是行不通的:這個批處理腳本的語法有什麼問題?

tasklist /FI "IMAGENAME eq pageant.exe" 2>NUL | find /I /N "pageant.exe">NUL 
if %ERRORLEVEL%==1 (:: checks whether pageant.exe is running or not 

    :: set the SSH-keys 
    if exist "C:\SSH keys\key1.ppk" (set KEYS="C:\SSH keys\key1.ppk") 
    if exist "C:\SSH keys\key2.ppk" (set KEYS=%KEYS% "C:\SSH keys\key2.ppk") 

    if not defined KEYS (
     msg * A SSH-key is propably missing. 
    ) 

    :: Start pageant with the defined SSH-keys 
    start /d"C:\Program Files (x86)\PuTTY" pageant.exe %KEYS% 

) 

雖然他們分開工作: (1)

tasklist /FI "IMAGENAME eq pageant.exe" 2>NUL | find /I /N "pageant.exe">NUL 
if %ERRORLEVEL%==1 (:: checks whether pageant.exe is running or not 

     :: This works! 
     start /d"C:\Program Files (x86)\PuTTY" pageant.exe 

) 

(2)

:: set the SSH-keys 
if exist "C:\SSH keys\key1.ppk" (set KEYS="C:\SSH keys\key1.ppk") 
if exist "C:\SSH keys\key2.ppk" (set KEYS=%KEYS% "C:\SSH keys\key2.ppk") 

if not defined KEYS (
    msg * A SSH-key is propably missing. 
) 

This works as well! 
start /d"C:\Program Files (x86)\PuTTY" pageant.exe %KEYS% 

它是一個語法問題?

+0

一種工作#1? –

+1

@GuyThomas堆棧溢出並不是特別滿意的問題,只是由代碼和修復請求組成。 OP應該說明究竟是什麼失敗,而不是說「它不起作用」,並顯示他們已經把問題縮小到了什麼程度。批處理腳本問題在這裏是主題,不需要遷移,特別是當涉及編寫甚至不需要編程(例如PuTTy)的軟件的腳本時。 – slhck

回答

4

沒有錯誤信息我只能猜測。

您是否啓用延遲擴展?見setlocal /?

給你的腳本 setlocal EnableExtensions EnableDelayedExpansionendlocal的beggining添加到您的腳本的末尾。

這允許KEYS變量來評估實際值。延遲擴展允許將值立即設置到變量,而不僅僅在if語句的範圍結束時。 if語句中設置的變量也不要忘記使用!而不是%

舉例:(在.bat一旦與EnableDepayedExpansion,一次不運行這個,你會看到其中的差別)

setlocal EnableExtensions EnableDelayedExpansion 

set "Value=Hello World" 
echo %Value% 
if 1==1 (
    set "Value=Goodbye World" 
    echo %Value% 
    echo !Value! 
) 
echo %Value% 

endlocal 
+0

這聽起來很有希望。明天我會試試。提前致謝! – jroeleveld

+0

太棒了!這樣可行。這確實是EnableDepayedExpansion和驚歎號的結合。 – jroeleveld