首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >批处理脚本中的空格而不破坏语法

批处理脚本中的空格而不破坏语法
EN

Stack Overflow用户
提问于 2021-12-27 07:46:43
回答 1查看 276关注 0票数 1

在批处理脚本中,是否有一种方法可以在每行的开头添加多个空格,而不中断语法,并在每一行上保留空格,如下面的示例所示?

代码语言:javascript
运行
复制
   gacutil /u ^
   Microsoft.IdentityModel.Clients.ActiveDirectory,^
   Version=2.28.0.725,^
   Culture=neutral,^
   PublicKeyToken=31bf3856ad364e35

其目标是不仅在使用gacutil.exe时而且在编写批处理命令时允许更好的可读性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-28 10:00:35

每个可执行文件都有自己的规则集,用于将可执行文件名后的字符串拆分为可执行文件进一步处理的参数值。

windows命令处理器cmd.exe解释一个水平制表符、一个普通空格、一个逗号、一个分号、一个等号和一个OEM编码的无中断空间(带有十六进制值FF的字节),在一个双引号字符串之外解释为参数分隔符,因为在运行一个名为test.cmd的批处理文件时,可以从命令提示符窗口中只看到命令行@echo %0 $1 $2 $3 $4

代码语言:javascript
运行
复制
test argument1,,,"argument 2";;;"argument 3 contains a comma ',' a semicolon ';' an equal sign '=' and multiple spaces"===argument4

导致产出

代码语言:javascript
运行
复制
test argument1 "argument 2" "argument 3 contains a comma ',' a semicolon ';' an equal sign '=' and multiple spaces" argument4

,,,;;;===被解释为参数字符串分隔符。

全局程序集缓存工具 gacutil.exe将传递给它的字符串拆分为与cmd.exe不同的参数字符串。逗号和等号不被解释为参数分隔符。只有法线空间字符被解释为参数分隔符,除了一个法线空间在一个双引号参数字符串中。

对于Windows可执行文件来说,参数字符串之间的参数分隔符的数量并不重要。因此,如果在两个参数字符串之间只使用一个空格或多个空格,则无关紧要。

在批处理文件中使用以下行会发生什么情况?

代码语言:javascript
运行
复制
   gacutil /u ^
   Microsoft.IdentityModel.Clients.ActiveDirectory,^
   Version=2.28.0.725,^
   Culture=neutral,^
   PublicKeyToken=31bf3856ad364e35

请先阅读:Windows解释器(CMD.EXE)如何解析脚本?

Windows命令处理器cmd.exe逐行读取批处理文件,将回车+行提要替换为读取一行时的行提要。

行尾的插入字符^cmd.exe解释为换行符行提要的转义字符,从而将下一行与当前行连接起来,直到到达批处理文件的末尾或找到未用^转义的行提要。在批处理文件中的行连接过程中,没有删除任何字符。

对于批处理文件中的上述行,每一行上有三个前导法向空格,其结果是:

代码语言:javascript
运行
复制
gacutil /u    Microsoft.IdentityModel.Clients.ActiveDirectory,   Version=2.28.0.725,   Culture=neutral,   PublicKeyToken=31bf3856ad364e35

在命令行开始时留给gacutil的三个前导空格被cmd.exe删除,但是所有其他空格都被保留,因为cmd.exe无法知道它们对于程序/脚本下一步运行是否重要。因此,在/u之后有四个空格,在批处理文件中的不同行上指定的其他字符串之间有三个空格。

gacutil.exe现在将命令行解释为以下参数的列表:

  1. /u
  2. Microsoft.IdentityModel.Clients.ActiveDirectory,
  3. Version=2.28.0.725,
  4. Culture=neutral,
  5. PublicKeyToken=31bf3856ad364e35

结果是一个错误消息,因为在这种情况下,必须只使用两个参数运行gacutil.exe

  1. 指示全局程序集缓存工具从全局程序集缓存卸载程序集的选项/u
  2. 和程序集名称Microsoft.IdentityModel.Clients.ActiveDirectory,Version=2.28.0.725,Culture=neutral,PublicKeyToken=31bf3856ad364e35

因此,批处理文件中未被cmd.exe删除的程序集名称参数字符串的各个部分之间使用的缩进空格使得命令行对于gacutil.exe无效。

因此,在这种情况下,不可能在具有缩进空格的多行上定义程序集名称参数字符串,因为cmd.exe如何将行与保留空格连接起来,以及gacutil.exe如何将从cmd.exe传递给它的字符串拆分为参数。

不同的可执行文件可以将字符串拆分为不同的参数值列表,因此,在带有缩进空间的批处理文件中的多行上写入可执行文件的参数可以适用于此可执行文件。

但是,可以在此用例的批处理文件中使用以下语法:

代码语言:javascript
运行
复制
   gacutil /u ^
   ^"Microsoft.IdentityModel.Clients.ActiveDirectory,^
   Version=2.28.0.725,^
   Culture=neutral,^
   PublicKeyToken=31bf3856ad364e35^"

全局程序集缓存工具在程序集名称中的逗号之后的一个或多个空格没有问题,只要整个程序集名称参数字符串都用双引号括起来。因此,在程序集名称字符串的开头有一个",在程序集名字符串的末尾还有一个"。但是,两个双引号必须用^对Windows命令处理器进行转义,否则cmd.exe会将每行末尾的插入字符^解释为文字字符,而不是转义字符。

cmd.exe必须将分散在多行上的命令行解释为双引号中没有参数字符串的行,以便将每个^解释为转义字符,而程序集名称在运行最后的命令行时以双引号括起来:

代码语言:javascript
运行
复制
gacutil /u    "Microsoft.IdentityModel.Clients.ActiveDirectory,   Version=2.28.0.725,   Culture=neutral,   PublicKeyToken=31bf3856ad364e35"

是的,这很奇怪。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70492864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档