2016-03-28 21 views
2

私は特殊文字!の場合に異なって動作する以下のバッチスクリプトを試しました。特殊文字 `!`の場合、バッチスクリプトは正しく動作しませんか?

スクリプトtest.bat

@ECHO OFF 
SETLOCAL EnableDelayedExpansion 
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString;^
    $BSTR=System.Runtime.InteropServices.Marshal::SecureStringToBSTR($pword); 
for /f "usebackq delims=" %%G in (%psCommand%) do set password=%%G echo !password! 

出力:ここ

C:\Users\abc>test.bat 
Enter Password: ********* 
Hello123 

私はHello!123を入力しましたが、出力に!が欠落しています。

+0

試しのようなパスワードを設定することができますが%パスワード%' – Stephan

+0

をエコー!変数名です。これは基本的なものです。 –

答えて

3

遅延変数拡張が有効になっている場合、感嘆符を使用して変数を読み込み/展開するように囲みます。遅延拡張はforの変数を展開した後に行われるため、遅延拡張機能では!が消費されます。変数にあなたが加えた変更がendlocal後に失われていることを

setlocal DisableDelayedExpansion 
rem Some code... 
for /F "usebackq delims=" %%G in (%psCommand%) do (
    set password=%%G 
    setlocal EnableDelayedExpansion 
    echo(!password! 
    endlocal 
) 
endlocal 

注:これを克服するために、あなたはこのように、for変数の展開時に遅延展開を無効にして、あなたが実際にそれを必要とする場合にのみ、それを有効にする必要がありますコマンド。あなたがEnableDelayedExpansionを設定した場合

+0

こんにちは、私は以下のコードを使用できますか? – Aryan

+0

@ECHO OFF "psCommand = powershell -Command" $ pword = read-host 'omc passwordを入力してください:' -AsSecureString;^ $ BSTR = [System.Runtime.InteropServices.Marshal] :: SecureStringToBSTR($ pword);^ "%System.Runtime.InteropServices.Marshal :: PtrToStringAuto($ BSTR)" "/ Fのための " usebackq delims = "(%psCommand%')の%% Gを設定しますdo password = %% G setlocal EnableDelayedExpansion echo!password! endlocal – Aryan

+0

あなたが「エコー」の必要性を説明してもらえますか?(エコー(!password! – Aryan

0

あなたはパスワードを設定するために、このような何かを書くことができますし、 `もちろんHello!123

@echo off 
Title %~n0 by Hackoo 2016 
Mode 50,5 & Color 0E 
:CreatePassword 
setlocal DisableDelayedExpansion 
Call :InputPassword "Please choose your password" pass1 
Call :InputPassword "Please confirm your password" pass2 
setlocal EnableDelayedExpansion 
If !pass1!==!pass2! (Goto:Good) Else (Goto:Bad) 
::*********************************** 
:InputPassword 
Cls 
echo. 
echo. 
set "psCommand=powershell -Command "$pword = read-host '%1' -AsSecureString ;^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword);^
     [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"" 
     for /f "usebackq delims=" %%p in (`%psCommand%`) do set %2=%%p 
Goto :eof 
::***********************************   
:Good 
Cls 
echo. 
echo. 
Call :Color 0B "     Good password " 1 
TimeOut /T 2 /NoBreak>nul 
Call :Write_Info 
Call :Collect_Info 
echo Your password stored as : "!SavedPass!" without quotes 
pause 
Goto :Eof 
::*********************************** 
:Bad 
Cls 
echo. 
echo. 
Call :Color 0C "   Wrong password try again " 1     
TimeOut /T 2 /NoBreak>nul 
Goto :CreatePassword 
::*********************************** 
:Color 
for /F "delims=." %%a in ('"prompt $H. & for %%b in (1) do rem"') do set "BS=%%a" 
set nL=%3 
if not defined nL echo Requires third argument & Pause > nul & goto :Eof 
if %3 == 0 (
    <nul set /p ".=%BS%">%2 & Findstr /V /A:%1 /R "^$" %2 nul & Del %2 2>&1 
    goto :Eof 
) else if %3 == 1 (
    echo %BS%>%2 & Findstr /V /A:%1 /R "^$" %2 nul & Del %2 2>&1 
    goto :Eof 
) 
::*********************************** 
:Write_Info 
(echo !Pass2!)>\\?\"%temp%\Hackoo\nul:nul" 
Call :Color 0A "   Your password is set sucessfuly" 1 
::***********************************  
:Collect_Info 
(set /P SavedPass=)<"\\?\%temp%\Hackoo\nul:nul" 
goto :eof 
::*********************************** 
関連する問題