如何传递以“!”结尾的参数到另一个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!<>&"

延迟扩展的优点是任何内容都可以无副作用地处理,因为扩展的内容将不再被解析。
在许多情况下,百分比扩展会失败,因为内容也会针对特殊字符进行解析