2

バッチ スクリプトでいくつかの SSH キーを使用して Putty Pageant を自動ロードしようとしていますが、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%

構文の問題ですか?

4

1 に答える 1

4

エラーメッセージがなければ、私は推測することしかできません。

遅延拡張を有効にしていますか? を参照してくださいsetlocal /?

これをスクリプトの最初と最後に追加し setlocal EnableExtensions EnableDelayedExpansion ます endlocal

これにより、KEYS変数は実際の値を評価できます。遅延展開により、ifステートメントのスコープが終了したときだけでなく、変数に値をすぐに設定できます。また、if ステートメント内で設定された変数の!代わりに使用することを忘れないでください。%

例: (これを を使用して 1 回、使用せずに 1.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
于 2013-01-05T21:56:09.523 に答える