Powershell 隐藏控制台中键入的密码-批处理脚本
BAT文件中使用的Powershell命令正在删除用户在控制台中指定的密码中可用的转义字符,并将其保存在文件中 我有一个BAT脚本,提示用户在控制台中指定密码。当用户在控制台中键入密码时,应将其屏蔽为******。密码将类似wel!123此密码保存到变量中,并最终复制到文本文件中。我得到了一些建议,在我的BAT文件中使用下面的代码,但是实际密码(Wel!123)中的转义字符被删除,并将密码作为Wel123保存到login.txt文件中Powershell 隐藏控制台中键入的密码-批处理脚本,powershell,batch-file,Powershell,Batch File,BAT文件中使用的Powershell命令正在删除用户在控制台中指定的密码中可用的转义字符,并将其保存在文件中 我有一个BAT脚本,提示用户在控制台中指定密码。当用户在控制台中键入密码时,应将其屏蔽为******。密码将类似wel!123此密码保存到变量中,并最终复制到文本文件中。我得到了一些建议,在我的BAT文件中使用下面的代码,但是实际密码(Wel!123)中的转义字符被删除,并将密码作为Wel123保存到login.txt文件中 SetLocal set "psCmd=powershell
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,您可能是正确的。我一直关注用户在写什么,因为他们一直在说“逃跑”。感叹号不是逃避。