有几种方法可以在同一脚本上bash以及cmd在同一脚本上执行不同的命令。
cmd将忽略:;其他以开头的以开头的行。如果当前行以命令结尾,它将也忽略下一行rem ^,因为^字符将逃脱换行符,并且下一行将被视为注释rem。
至于bash忽略这些cmd行,有多种方法。我列举了一些不破坏 cmd命令的方法:
不存在的#命令(不建议)
如果在运行脚本时没有#可用的命令cmd,我们可以这样做:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
该行#开头的字符cmd使bash该行作为注释。
正如布莱恩·汤普塞特(Brian Tompsett)在回答中指出的那样#,该bash行末尾的字符用于注释掉该\r字符。如果没有该文件,则如果文件具有行尾(由要求),将引发错误。bash\r\ncmd
通过这样做# 2>nul,我们欺骗cmd了一些不存在的#命令的错误,同时仍然执行后面的命令。
如果上有#可用命令,PATH或者您无法控制可用的命令,请不要使用此解决方案cmd。
使用echo忽略#人品cmd
我们可以将echo其输出重定向使用,以cmd在bash的注释区域插入命令:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
由于该#字符没有特殊含义cmd,因此将其视为to的一部分echo。我们要做的就是重定向echo命令的输出,并在其后插入其他命令。
空#.bat文件
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
该echo >/dev/null # 1>nul 2> #.bat行在#.bat打开时会创建一个空文件cmd(或替换现有文件#.bat,如果有的话),而在打开时则不执行任何操作bash。
cmd即使。上还有其他#命令,此文件也将由其后的行使用PATH。
在del #.bat该命令cmd特异性代码删除已创建的文件。您只需要在最后cmd一行上执行此操作。
如果#.bat文件可能位于您当前的工作目录中,请不要使用此解决方案,因为该文件将被删除。
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
通过将^字符放在行的末尾,cmd我们可以使换行符转义,并:用作此处的定界符,定界符的行内容将对无效cmd。这样,cmd将仅在行结束后执行其行:,其行为与相同bash。
如果您想在两个平台上都有多行并且仅在代码块的末尾执行,则可以执行以下操作:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
只要cmd与完全不符here-document delimiter,该解决方案就可以工作。您可以更改here-document delimiter为任何其他文本。
在所有提出的解决方案中,命令仅在最后一行之后执行,如果它们在两个平台上执行相同的操作,则使它们的行为保持一致。
这些解决方案必须以\r\n换行符保存到文件中,否则它们将无法使用cmd。