密码功能批处理

11 浏览
0 Comments

密码功能批处理

我想知道是否可以检查输入是否与变量匹配。

这是我现在的代码:

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功能,但它不起作用。

0
0 Comments

在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的问题,确保安全性和正确性。

0
0 Comments

问题出现的原因:

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编写整个脚本。

0