有几种方法可以在同一脚本上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\n
cmd
通过这样做# 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
。