在批处理脚本中,是否有一种方法可以在每行的开头添加多个空格,而不中断语法,并在每一行上保留空格,如下面的示例所示?
gacutil /u ^
Microsoft.IdentityModel.Clients.ActiveDirectory,^
Version=2.28.0.725,^
Culture=neutral,^
PublicKeyToken=31bf3856ad364e35
其目标是不仅在使用gacutil.exe
时而且在编写批处理命令时允许更好的可读性。
发布于 2021-12-28 10:00:35
每个可执行文件都有自己的规则集,用于将可执行文件名后的字符串拆分为可执行文件进一步处理的参数值。
windows命令处理器cmd.exe
解释一个水平制表符、一个普通空格、一个逗号、一个分号、一个等号和一个OEM编码的无中断空间(带有十六进制值FF的字节),在一个双引号字符串之外解释为参数分隔符,因为在运行一个名为test.cmd
的批处理文件时,可以从命令提示符窗口中只看到命令行@echo %0 $1 $2 $3 $4
。
test argument1,,,"argument 2";;;"argument 3 contains a comma ',' a semicolon ';' an equal sign '=' and multiple spaces"===argument4
导致产出
test argument1 "argument 2" "argument 3 contains a comma ',' a semicolon ';' an equal sign '=' and multiple spaces" argument4
,,,
、;;;
和===
被解释为参数字符串分隔符。
全局程序集缓存工具 gacutil.exe
将传递给它的字符串拆分为与cmd.exe
不同的参数字符串。逗号和等号不被解释为参数分隔符。只有法线空间字符被解释为参数分隔符,除了一个法线空间在一个双引号参数字符串中。
对于Windows可执行文件来说,参数字符串之间的参数分隔符的数量并不重要。因此,如果在两个参数字符串之间只使用一个空格或多个空格,则无关紧要。
在批处理文件中使用以下行会发生什么情况?
gacutil /u ^
Microsoft.IdentityModel.Clients.ActiveDirectory,^
Version=2.28.0.725,^
Culture=neutral,^
PublicKeyToken=31bf3856ad364e35
请先阅读:Windows解释器(CMD.EXE)如何解析脚本?
Windows命令处理器cmd.exe
逐行读取批处理文件,将回车+行提要替换为读取一行时的行提要。
行尾的插入字符^
被cmd.exe
解释为换行符行提要的转义字符,从而将下一行与当前行连接起来,直到到达批处理文件的末尾或找到未用^
转义的行提要。在批处理文件中的行连接过程中,没有删除任何字符。
对于批处理文件中的上述行,每一行上有三个前导法向空格,其结果是:
gacutil /u Microsoft.IdentityModel.Clients.ActiveDirectory, Version=2.28.0.725, Culture=neutral, PublicKeyToken=31bf3856ad364e35
在命令行开始时留给gacutil
的三个前导空格被cmd.exe
删除,但是所有其他空格都被保留,因为cmd.exe
无法知道它们对于程序/脚本下一步运行是否重要。因此,在/u
之后有四个空格,在批处理文件中的不同行上指定的其他字符串之间有三个空格。
gacutil.exe
现在将命令行解释为以下参数的列表:
/u
Microsoft.IdentityModel.Clients.ActiveDirectory,
Version=2.28.0.725,
Culture=neutral,
PublicKeyToken=31bf3856ad364e35
结果是一个错误消息,因为在这种情况下,必须只使用两个参数运行gacutil.exe
:
/u
。Microsoft.IdentityModel.Clients.ActiveDirectory,Version=2.28.0.725,Culture=neutral,PublicKeyToken=31bf3856ad364e35
。因此,批处理文件中未被cmd.exe
删除的程序集名称参数字符串的各个部分之间使用的缩进空格使得命令行对于gacutil.exe
无效。
因此,在这种情况下,不可能在具有缩进空格的多行上定义程序集名称参数字符串,因为cmd.exe
如何将行与保留空格连接起来,以及gacutil.exe
如何将从cmd.exe
传递给它的字符串拆分为参数。
不同的可执行文件可以将字符串拆分为不同的参数值列表,因此,在带有缩进空间的批处理文件中的多行上写入可执行文件的参数可以适用于此可执行文件。
但是,可以在此用例的批处理文件中使用以下语法:
gacutil /u ^
^"Microsoft.IdentityModel.Clients.ActiveDirectory,^
Version=2.28.0.725,^
Culture=neutral,^
PublicKeyToken=31bf3856ad364e35^"
全局程序集缓存工具在程序集名称中的逗号之后的一个或多个空格没有问题,只要整个程序集名称参数字符串都用双引号括起来。因此,在程序集名称字符串的开头有一个"
,在程序集名字符串的末尾还有一个"
。但是,两个双引号必须用^
对Windows命令处理器进行转义,否则cmd.exe
会将每行末尾的插入字符^
解释为文字字符,而不是转义字符。
cmd.exe
必须将分散在多行上的命令行解释为双引号中没有参数字符串的行,以便将每个^
解释为转义字符,而程序集名称在运行最后的命令行时以双引号括起来:
gacutil /u "Microsoft.IdentityModel.Clients.ActiveDirectory, Version=2.28.0.725, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
是的,这很奇怪。
https://stackoverflow.com/questions/70492864
复制相似问题