如何传递以“!”结尾的参数到另一个bat文件?
How to pass parameter ending with "!" to another bat file?
我有两个 bat 文件,我需要将三个参数从一个 bat 文件传递到另一个。但是,如果参数以“!”结尾未收到参数
caller.bat
impl.bat param1 param2! param3
impl.bat
echo %1
echo %2
echo %3
预期结果 运行 caller.bat:
param1
param2!
param3
实际结果 运行 caller.bat:
param1
param2
param3
任何人都可以帮助我如何实现实际结果吗?
实际上,解释标记被目标批处理文件接收,但在处理回显命令时被丢弃。如果你打开了回显,你可以看到这个。 (但是,如果使用call
命令对运行批处理文件,解释标记不会传递给它。)
解释标记仅在启用延迟扩展时被丢弃。您可以通过暂时关闭延迟扩展来更正它:
setlocal disabledelayedexpansion
impl.bat param1 param2! param3
您也可以通过用插入符号引用特殊字符来解决它,但由于参数经过多个处理级别,您必须多次引用它:
impl.bat param1 param2^^^^^! param3
或
call impl.bat param1 param2^^^^^^^^^^! param3
这种方法可能不可靠,因为它取决于 child 对参数的处理方式。最好关闭延迟扩展,尽管如果 child 再次打开它就不会起作用。
解决方案是禁用延迟扩展的少数情况之一。我假设您在启动 cmd.exe
时或作为批处理文件中的 setlocal
行启用它。无论哪种方式,最短的答案是停止打开它 - 默认情况下 cmd 参数完全符合您的要求。
如果您在其他地方依赖延迟扩展并且无法全局关闭它,那么您可以使用 setlocal
为一段代码禁用它。
echo %1
setlocal disabledelayedexpansion
echo %2
endlocal
echo %3
请注意,在任何使用感叹号扩展变量的地方,必须关闭延迟扩展。这包括您是否将其设置为变量并稍后使用该变量。
正如其他答案所说,可以禁用延迟扩展,但没有必要显示感叹号。
将感叹号(和其他特殊字符)放入变量中很重要。
然后你可以完美地使用它延迟扩展
样本
@echo off
set "param1=%~1"
set "param2=%~2"
setlocal EnableDelayedExpansion
echo Works: !param1! !param2!
echo FAILS: %param1% %param2%
用
调用
myBatch.bat arg1! "arg2!<>&"
延迟扩展的优点是任何内容都可以无副作用地处理,因为扩展的内容将不再被解析。
在许多情况下,百分比扩展会失败,因为内容也会针对特殊字符进行解析
我有两个 bat 文件,我需要将三个参数从一个 bat 文件传递到另一个。但是,如果参数以“!”结尾未收到参数
caller.bat
impl.bat param1 param2! param3
impl.bat
echo %1
echo %2
echo %3
预期结果 运行 caller.bat:
param1
param2!
param3
实际结果 运行 caller.bat:
param1
param2
param3
任何人都可以帮助我如何实现实际结果吗?
实际上,解释标记被目标批处理文件接收,但在处理回显命令时被丢弃。如果你打开了回显,你可以看到这个。 (但是,如果使用call
命令对运行批处理文件,解释标记不会传递给它。)
解释标记仅在启用延迟扩展时被丢弃。您可以通过暂时关闭延迟扩展来更正它:
setlocal disabledelayedexpansion
impl.bat param1 param2! param3
您也可以通过用插入符号引用特殊字符来解决它,但由于参数经过多个处理级别,您必须多次引用它:
impl.bat param1 param2^^^^^! param3
或
call impl.bat param1 param2^^^^^^^^^^! param3
这种方法可能不可靠,因为它取决于 child 对参数的处理方式。最好关闭延迟扩展,尽管如果 child 再次打开它就不会起作用。
解决方案是禁用延迟扩展的少数情况之一。我假设您在启动 cmd.exe
时或作为批处理文件中的 setlocal
行启用它。无论哪种方式,最短的答案是停止打开它 - 默认情况下 cmd 参数完全符合您的要求。
如果您在其他地方依赖延迟扩展并且无法全局关闭它,那么您可以使用 setlocal
为一段代码禁用它。
echo %1
setlocal disabledelayedexpansion
echo %2
endlocal
echo %3
请注意,在任何使用感叹号扩展变量的地方,必须关闭延迟扩展。这包括您是否将其设置为变量并稍后使用该变量。
正如其他答案所说,可以禁用延迟扩展,但没有必要显示感叹号。
将感叹号(和其他特殊字符)放入变量中很重要。
然后你可以完美地使用它延迟扩展
样本
@echo off
set "param1=%~1"
set "param2=%~2"
setlocal EnableDelayedExpansion
echo Works: !param1! !param2!
echo FAILS: %param1% %param2%
用
调用myBatch.bat arg1! "arg2!<>&"
延迟扩展的优点是任何内容都可以无副作用地处理,因为扩展的内容将不再被解析。
在许多情况下,百分比扩展会失败,因为内容也会针对特殊字符进行解析