我有两个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
任何人都可以帮助我如何实现实际结果吗?
答案 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.exe
或setlocal
行时启用它。无论哪种方式,最短的答案是停止打开 - 默认情况下,cmd参数完全符合您的要求。
如果您依赖其他地方的延迟扩展并且无法在全球范围内关闭它,那么您可以使用setlocal
为一大块代码禁用它。
echo %1
setlocal disabledelayedexpansion
echo %2
endlocal
echo %3
请注意,无论您使用爆炸符号扩展变量,都必须关闭延迟扩展。这包括如果将其设置为变量并稍后使用该变量。