如何分配包含!的命令行参数和 & 到一个变量?

How to assign a command line parameter which contains ! and & to a variable?

请考虑以下非常简单的批处理脚本(文件名为 test.cmd):

@echo off

set "var1=%~1"
echo %var1%

该脚本应使用一个命令行参数调用,应将该参数中包含的字符串分配给一个变量,并应输出该变量。

正如预期的那样,当我使用包含与符号 (&) 的命令行参数调用此脚本时收到错误消息:

C:\Batch>test "a&b"
a
'b' is not recognized as an internal or external command,
operable program or batch file.

这里和其他地方的一些其他问题已经讨论了这样做的原因,例如 that one;通常的补救措施是使用延迟扩展。所以我相应地更改了脚本:

@echo off

setLocal enableDelayedExpansion

set "var1=%~1"
echo !var1!

现在它可以使用之前的参数:

C:\Batch>test "a&b"
a&b

但是又出现了新的问题。当命令行参数包含感叹号(!)时,会从输出中去掉:

C:\Batch>test a!b
ab

此行为也在多个地方进行了讨论,例如 here;需要注意的关键是,删除感叹号发生在 赋值 期间,而不是 echo.

期间

尽管进行了大量研究,但我没有在此处找到可以同时解决两个问题 的优雅解决方案的问题。也就是说,当参数包含一个符号和一个感叹号时,是否有一种优雅的方法将命令行参数分配给一个变量?

看来我需要延迟扩展才能正确处理和号,但这破坏了感叹号。

我目前看到的唯一解决方案是使用延迟扩展并添加代码以显式引用输入字符串中的所有&符号。这太丑陋了,我真的认为我在这里遗漏了一些东西。

附带说明一下,问题的原因实际上似乎是(恕我直言!)无法以延迟扩展的方式获取命令行参数。第一个参数的语法是%~1,没有!~1.

setLocal enableDelayedExpansion移到set之后就可以了。

@echo off

set "var1=%~1"
setLocal enableDelayedExpansion
echo !var1!