Windows 如何分配包含以下内容的命令行参数!及;到一个变量? 请考虑以下非常简单的批处理脚本(文件名为代码> Test.CMD):

Windows 如何分配包含以下内容的命令行参数!及;到一个变量? 请考虑以下非常简单的批处理脚本(文件名为代码> Test.CMD):,windows,batch-file,command-line-arguments,Windows,Batch File,Command Line Arguments,应使用一个命令行参数调用脚本,应将该参数中包含的字符串分配给变量,并应输出该变量 正如所料,当我使用包含符号(&)的命令行参数调用此脚本时,会收到一条错误消息: 原因已经在这里和其他地方的一些其他问题中讨论过,例如;通常的补救办法是使用延迟扩展。因此,我相应地修改了脚本: @echo off setLocal enableDelayedExpansion set "var1=%~1" echo !var1! 现在它可以使用以前的参数: C:\Batch>test "a&b"

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

正如所料,当我使用包含符号(
&
)的命令行参数调用此脚本时,会收到一条错误消息:

原因已经在这里和其他地方的一些其他问题中讨论过,例如;通常的补救办法是使用延迟扩展。因此,我相应地修改了脚本:

@echo off

setLocal enableDelayedExpansion

set "var1=%~1"
echo !var1!
现在它可以使用以前的参数:

C:\Batch>test "a&b"
a&b
但有一个新问题。当命令行参数包含感叹号(
)时,它将从输出中删除:

C:\Batch>test a!b
ab
这种行为在一些地方也被讨论过,例如;需要注意的关键是,删除感叹号发生在赋值过程中,而不是在
回显过程中

尽管进行了大量研究,但我在这里没有发现一个问题能够同时为这两个问题提供一个优雅的解决方案。也就是说,当一个命令行参数包含一个符号和一个感叹号时,是否有一种优雅的方式将该参数指定给一个变量?

似乎我需要延迟扩展来正确处理符号AND,但这会破坏感叹号

我目前看到的唯一解决方案是不使用延迟扩展,而是添加代码来显式引用输入字符串中的所有符号。这太难看了,我真的觉得我错过了什么


作为旁注,问题的原因实际上似乎是(IMHO!)无法以延迟扩展的方式获取命令行参数。第一个参数的语法是
%~1
,没有
这样的东西~1

设置本地启用延迟扩展
移动到
设置
之后。仅此而已

@echo off

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

设置本地启用延迟扩展
移动到
设置
之后。仅此而已

@echo off

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

你是对的。很抱歉错过了这个。我的一个测试出错了,所以我认为如果命令行参数包含一个符号,则抛出错误的实际上是赋值(
set…
)。现在我有一个问题:一方面,考虑到我搞砸了导致我提问的一个测试,我的问题现在有点没用,所以我想删除它。另一方面,我相信你的回答是正确的。我该怎么办?@Binarus如果你认为这个问题没用,那就把它删除,几个学分不应该成为打开它的理由,你是对的。很抱歉错过了这个。我的一个测试出错了,所以我认为如果命令行参数包含一个符号,则抛出错误的实际上是赋值(
set…
)。现在我有一个问题:一方面,考虑到我搞砸了导致我提问的一个测试,我的问题现在有点没用,所以我想删除它。另一方面,我相信你的回答是正确的。我该怎么办?@Binarus如果你认为这个问题没用,那就把它删掉,几张信用卡不应该成为留下来的理由
@echo off

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