将具有特殊字符的参数从批处理文件发送到另一个批处理文件

时间:2017-01-04 09:59:52

标签: windows batch-file cmd parameters special-characters

我有以下代码:

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

2 个答案:

答案 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使用感叹号作为特殊符号,因此会被删除。