Il existe plusieurs manières d'exécuter différentes commandes sur bashet cmdavec le même script.
cmdignorera les lignes commençant par :;, comme mentionné dans d'autres réponses. Il ignorera également la ligne suivante si la ligne actuelle se termine par la commande rem ^, car le ^caractère échappera au saut de ligne et la ligne suivante sera traitée comme un commentaire par rem.
Quant à faire bashignorer les cmdlignes, il existe de multiples façons. J'ai énuméré quelques façons de le faire sans casser les cmdcommandes:
#Commande inexistante (non recommandée)
S'il n'y a pas de #commande disponible cmdlors de l'exécution du script, nous pouvons le faire:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Le #caractère au début de la cmdligne permet de bashtraiter cette ligne comme un commentaire.
Le #caractère à la fin de la bashligne est utilisé pour commenter le \rpersonnage, comme l'a souligné Brian Tompsett dans sa réponse . Sans cela, bashgénérera une erreur si le fichier a des \r\nfins de ligne, requises par cmd.
Ce faisant # 2>nul, nous avons du mal cmdà ignorer l'erreur d'une #commande inexistante , tout en exécutant la commande qui suit.
N'utilisez pas cette solution si une #commande est disponible sur le PATHou si vous n'avez aucun contrôle sur les commandes disponibles pour cmd.
Utiliser echopour ignorer le #personnage surcmd
Nous pouvons utiliser echoavec sa sortie redirigée pour insérer des cmdcommandes dans bashla zone commentée de:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Étant donné que le #caractère n'a pas de signification particulière cmd, il est traité comme une partie du texte à echo. Tout ce que nous avions à faire était de rediriger la sortie de la echocommande et d'insérer d'autres commandes après.
#.batFichier vide
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
La echo >/dev/null # 1>nul 2> #.batligne crée un #.batfichier vide lorsqu'elle est activée cmd(ou remplace l'existant #.bat, le cas échéant) et ne fait rien lorsqu'elle est activée bash.
Ce fichier sera utilisé par la ou les cmdlignes qui suivent même s'il existe une autre #commande sur le PATH.
La del #.batcommande sur le cmdcode spécifique supprime le fichier qui a été créé. Vous ne devez le faire que sur la dernière cmdligne.
N'utilisez pas cette solution si un #.batfichier peut se trouver dans votre répertoire de travail actuel, car ce fichier sera effacé.
Recommandé: utiliser here-document pour ignorer les cmdcommandes surbash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
En plaçant le ^caractère à la fin de la cmdligne, nous échappons au saut de ligne, et en utilisant :comme délimiteur ici-document, le contenu de la ligne de délimitation n'aura aucun effet sur cmd. De cette façon, cmdn'exécutera sa ligne qu'une fois la :ligne terminée, ayant le même comportement que bash.
Si vous souhaitez avoir plusieurs lignes sur les deux plates-formes et ne les exécuter qu'à la fin du bloc, vous pouvez le faire:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Tant qu'il n'y a pas de cmdligne avec exactement here-document delimiter, cette solution devrait fonctionner. Vous pouvez passer here-document delimiterà n'importe quel autre texte.
Dans toutes les solutions présentées, les commandes ne seront exécutées qu'après la dernière ligne , rendant leur comportement cohérent si elles font la même chose sur les deux plates-formes.
Ces solutions doivent être enregistrées dans des fichiers avec des \r\nsauts de ligne, sinon elles ne fonctionneront pas cmd.