我有以下代码:
second.bat
档案
echo %~1
echo %~2
first.bat
档案
@ECHO OFF &SETLOCAL
@SETLOCAL EnableExtensions EnableDelayedExpansion
set /p User=Enter Username:
set /p Password=Enter Password:
call second.bat %User% %Password%
如果用户输入Admin
作为用户名,Admin!23
作为密码,second.bat
回音中产生的输出如下:
Admin Admin23
如何在second.bat
文件中获取特殊字符,如下所示?
Admin Admin!23
答案 0 :(得分:2)
这取决于你的可能性
您是否可以更改second.bat
文件?
然后你应该通过(变量)引用而不是值来传递值,因为CALL
不能很好地处理复杂的值。
解决方案1:
然后你可以将second.bat更改为
@echo off
echo !user!, !password!
解决方案2:
如果您不允许更改second.bat且需要密码作为调用参数,则可以将first.bat
更改为
@ECHO OFF
setlocal EnableExtensions EnableDelayedExpansion
set /p User=Enter Username:
set /p Password=Enter Password:
set ^"password=!password:"=""!"
setlocal DisableDelayedExpansion
call second.bat "%%User%%" "%%Password%%"
exit /b
只有在使用密码中的引号时它才会失败,然后它们会加倍。
解决方案3:
在不修改文件的情况下将代码注入second.bat。
假设second.bat看起来像
@echo off
setlocal EnableDelayedExpansion
set "user=%~1"
set "pwd=%~2"
echo !pwd!
将first.bat更改为:
set ^"Inject=." & (set pwd=^!password^!) & rem #"
call second.bat "%%User%%" %%Inject%%
这可以处理任何密码,如second.bat中的行
set "pwd=%~2"
将修改即时
set "pwd=." & (set pwd=!password!) & rem #"
答案 1 :(得分:1)
到目前为止,您不需要DelayedExpansion!如果您需要它,之后激活它!如果您回显示例的最后一行,您将看到!
也应该丢失。
由于DelayedExpansion使用感叹号作为特殊符号,因此会被删除。