如何传递以“!”结尾的参数到另一个bat文件?

时间:2015-05-21 02:07:12

标签: windows batch-file parameters cmd parameter-passing

我有两个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

任何人都可以帮助我如何实现实际结果吗?

3 个答案:

答案 0 :(得分:2)

正如其他答案所说,可以禁用延迟扩展,但是显示感叹号并不是必需的。

将感叹号(和其他特殊字符)放入变量非常重要。
然后,您可以完美地使用延迟扩展

样品

@echo off
set "param1=%~1"
set "param2=%~2"
setlocal EnableDelayedExpansion
echo Works: !param1! !param2!
echo FAILS: %param1% %param2%

调用它
myBatch.bat arg1! "arg2!<>&"

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

答案 1 :(得分:1)

实际上,解释标记由目标批处理文件接收,但在处理echo命令时将被丢弃。如果你打开了回音,你可以看到这个。 (但是,如果使用call命令运行批处理文件,则说明标记不会传递给它。)

只有在启用延迟扩展时才会丢弃说明标记。您可以通过暂时关闭延迟扩展来纠正它:

setlocal disabledelayedexpansion
impl.bat param1 param2! param3

您也可以通过引用带插入符号的特殊字符来解决它,但是由于参数经过多个级别的处理,您必须多次引用它:

impl.bat param1 param2^^^^^! param3

call impl.bat param1 param2^^^^^^^^^^! param3

这种方法可能不可靠,因为它取决于孩子对参数做了什么。最好关闭延迟扩张,但如果孩子再次开启则不会起作用。

答案 2 :(得分:1)

解决方案之一是禁用延迟扩展的少数情况之一。我假设您在批处理文件中启动cmd.exesetlocal行时启用它。无论哪种方式,最短的答案是停止打开 - 默认情况下,cmd参数完全符合您的要求。

如果您依赖其他地方的延迟扩展并且无法在全球范围内关闭它,那么您可以使用setlocal为一大块代码禁用它。

echo %1

setlocal disabledelayedexpansion
echo %2
endlocal

echo %3

请注意,无论您使用爆炸符号扩展变量,都必须关闭延迟扩展。这包括如果将其设置为变量并稍后使用该变量。