Powershell 隐藏控制台中键入的密码-批处理脚本

Powershell 隐藏控制台中键入的密码-批处理脚本,powershell,batch-file,Powershell,Batch File,BAT文件中使用的Powershell命令正在删除用户在控制台中指定的密码中可用的转义字符,并将其保存在文件中 我有一个BAT脚本,提示用户在控制台中指定密码。当用户在控制台中键入密码时,应将其屏蔽为******。密码将类似wel!123此密码保存到变量中,并最终复制到文本文件中。我得到了一些建议,在我的BAT文件中使用下面的代码,但是实际密码(Wel!123)中的转义字符被删除,并将密码作为Wel123保存到login.txt文件中 SetLocal set "psCmd=powershell

BAT文件中使用的Powershell命令正在删除用户在控制台中指定的密码中可用的转义字符,并将其保存在文件中

我有一个BAT脚本,提示用户在控制台中指定密码。当用户在控制台中键入密码时,应将其屏蔽为******。密码将类似wel!123此密码保存到变量中,并最终复制到文本文件中。我得到了一些建议,在我的BAT文件中使用下面的代码,但是实际密码(Wel!123)中的转义字符被删除,并将密码作为Wel123保存到login.txt文件中

SetLocal
set "psCmd=powershell -Command "$pwd = read-host 'Enter Your Password' - 
AsSecureString; $BSTR= 
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd); 
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /F "usebackq delims=" %%# in (`%psCmd%`) do set "pwd=%%#"

@echo %pwd%>>login.txt

要将其转换为PowerShell,您已经编写了大部分代码:

$pwd = Read-Host 'Enter Your Password' -AsSecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) | Add-Content -Path login.txt

字符消失与PowerShell无关-它表明
cmd.exe
启用延迟扩展
选项有效,在这种情况下
用作变量名分隔符-在这种情况下是孤立的
字符。它们只是被丢弃

作为旁白:
不是转义字符

因此,您需要:

  • 使用
    setLocal disabledelayedexpansion禁用延迟变量扩展

    • 请注意,延迟扩展在默认情况下是关闭的,因此您的环境中一定有什么东西打开了它
  • 另外,正如所指出的,
    ^
    字符-
    cmd.exe
    的转义字符。在不带引号的字符串中-将被“吃掉”,因此必须转义所有
    ^
    字符。作为
    ^
    ,您可以使用
    %pwd:^=^^%
    执行哪项操作

总而言之:

@echo off
setLocal disabledelayedexpansion

set "psCmd=powershell -Command "$pwd = read-host 'Enter Your Password' -AsSecureString; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pwd); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""

for /F "usebackq delims=" %%# in (`%psCmd%`) do set "pwd=%%#"

echo %pwd:^=^^%>>login.txt

我建议完全在Powershell中执行此操作。您能告诉我如何执行此操作吗?如果您的代码中缺少某些内容,则可能会出现重复。
^
未写入
login.txt
的原因是变量在执行前已展开,并假定您希望将
^
用作转义字符。您需要用字符串替换来转义,或者用延迟扩展来输出变量。@mklement0,您可能是正确的。我一直关注用户在写什么,因为他们一直在说“逃跑”。感叹号不是逃避。