密码功能批处理
密码功能批处理
我想知道是否可以检查输入是否与变量匹配。
这是我现在的代码:
powershell -Command "$pword = Read-Host -Prompt '输入密码' -AsSecureString; ^ $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^ $password=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)" | set /p password= if "%password%" == "test" ( echo 你好 timeout /t 2 ) else ( echo 无效密码。 timeout /t 2 exit )
我想检查密码输入是否与变量匹配。
我尝试添加if not
功能,但它不起作用。
在PowerShell和Batch之间传递密码时,出现了(Password function batch)这个问题。问题的原因是无法直接从PowerShell中传递密码给Batch。为了解决这个问题,可以使用"for /f do command"命令来捕获从PowerShell传递给Batch的密码。
下面是一个示例代码:
off
Title Check typed password
Call :CheckPassword
::----------------------------------------------------------------------------------------------
:CheckPassword
Mode con cols=55 lines=3
cls & color 0B & echo.
set MyPassword=Test
set "psCommand=powershell -Command "$pword = read-host 'Enter your password' -AsSecureString ; ^
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
if "%MyPassword%"=="%password%" (Goto:Good) else (Goto:Bad)
exit/b
::----------------------------------------------------------------------------------------------
:Good
Cls & Color 0A
echo(
echo Good Password
TimeOut /T 2 /NoBreak>nul
Exit
::----------------------------------------------------------------------------------------------
:Bad
Cls & Color 0C
echo(
echo Bad password
TimeOut /T 1 /NoBreak>nul
Goto:CheckPassword
::----------------------------------------------------------------------------------------------
在以上代码中,首先定义了一个名为"CheckPassword"的标签。然后,通过设置"psCommand"变量为一个PowerShell命令,该命令用于读取密码,并将其转换为安全字符串。接下来,使用"for /f"命令来捕获从PowerShell传递给Batch的密码,并将其存储在"password"变量中。然后,通过比较"password"变量和预定义的"MyPassword"变量,确定密码是否正确。如果密码正确,将跳转到"Good"标签,显示"Good Password"消息并退出程序。如果密码不正确,将跳转到"Bad"标签,显示"Bad password"消息并重新开始密码验证过程。
通过使用"for /f do command"命令,我们可以解决从PowerShell传递密码给Batch的问题,确保安全性和正确性。
问题出现的原因:
1. 在PowerShell代码中无法使用批处理的行连接符(^)。
2. 必须在PowerShell代码内部将密码写入标准输出(stdout),否则周围的批处理代码将无法“看到”它。
3. 不能通过使用“| set /P var=”来获取输出(参见上述问题)。如果要实现这一点,可以使用批处理中的for语法。
解决方法:
将上述问题综合起来,可以得到以下解决方法:
@echo off REM 这里可以放一些代码,以减少输出混乱。 REM 将PowerShell代码存储在批处理变量中,以便更好地处理。 REM 注意PowerShell代码末尾的Write-Host输出密码。 set psargs=$pword = Read-Host -Prompt 'Enter Password' -AsSecureString; set psargs=%psargs% $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); set psargs=%psargs% $password=[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR); set psargs=%psargs% Write-Host $password REM 调用PowerShell并将输出存储在批处理变量“password”中。 for /F usebackq %%i in (`powershell -NoProfile -Command "%psargs%"`) do ( set password=%%~i ) REM 进行密码测试。 if "%password%" == "test" ( echo hi timeout /t 2 ) else ( echo Invalid password. timeout /t 2 exit )
也可以采用其他方法来实现相同的效果。例如,您还可以在PowerShell代码中测试密码,并使用“exit 1”或“exit 0”来通知批处理代码(使用“if %ERRORLEVEL% ...”)密码是否正确。或者最初就完全使用PowerShell编写整个脚本。