2017-08-22 12 views
0

バッチファイルを実行するだけで、複数のシステムにログインするためにPuttyコマンドラインを使用するスクリプトを作成しています。バッチは、起動したいサーバー名のリストを問題なくテキストファイルから読み込みます。遅延展開がバッチスクリプト全体で機能しない

「set/p」で入力したパスワードを使用すると問題が発生します。パスワードには、アンパサンドなどの特殊文字が含まれています。変数を使用するには、DELAYEDEXPANSIONを使用しようとしています。

!passを使用して、パスワードを使用して変数をエコーすることができます。しかし、puttyが呼び出されるforループ内で使用されると、DELAYEDEXPANSIONは失敗するようです。結果は文字通り!パス!

SETLOCAL ENABLEDELAYEDEXPANSION 
set /p destination="Enter the file name: " 
set /p "pass=Your LAN PASSword: " 

ECHO Pass=!pass! 

pause 
for /F %%z in (%destination%) do (
start C:\DEV\Utilities\putty\putty -ssh %username%@%%z -pw !pass! -m "C:\DEV\Utilities\putty\commands" -t 
timeout /t 01 /nobreak > NUL 
) 
pause 

%pass%のようなパーセント記号を持つ変数を使用すると、パスワードが正しくありません。たとえば、「c & ndyCone」は「c & ndyCone」(引用符は少ない)となります。パテに正しいパスワードを渡すための提案はありますか?

答えて

1

ここでの問題は遅延拡張ではなく、二重引用符でもエスケープされた文字でもない&です。
だから、それはこのように二つにあなたの1つのコマンドラインを破るコマンドの連結として解釈される - 第二はほとんど有効なコマンドではありません、パスワードの残りの部分で始まる:ndyCone

第二には、スタートは二重引用符の最初の引数を解釈するということですウィンドウのタイトルとして。

試してみてください。

::commented out SETLOCAL ENABLEDELAYEDEXPANSION 
set /p destination="Enter the file name: " 
set /p "pass=Your LAN PASSword: " 

ECHO Pass="%pass%" 

pause 
for /F %%z in (%destination%) do (
start "" C:\DEV\Utilities\putty\putty -ssh %username%@%%z -pw "%pass%" -m "C:\DEV\Utilities\putty\commands" -t 
timeout /t 01 /nobreak > NUL 
) 
pause 
+0

私はこれが好きで、動作するように表示されます。私の質問に基づいて構築するには、パスワードの一部として引用符がある場合、これは動作しますか?シングルまたはダブル、オープンまたはクローズ?ごめんなさい。 – gritts

+0

二重引用符は、二重引用符で囲まれたバックスラッシュでエスケープすることができます。単一引用符はバッチで特別な意味を持ちません。 – LotPings

関連する問題