Il existe plusieurs manières d'exécuter différentes commandes sur bash
et cmd
avec le même script.
cmd
ignorera 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 bash
ignorer les cmd
lignes, il existe de multiples façons. J'ai énuméré quelques façons de le faire sans casser les cmd
commandes:
#
Commande inexistante (non recommandée)
S'il n'y a pas de #
commande disponible cmd
lors 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 cmd
ligne permet de bash
traiter cette ligne comme un commentaire.
Le #
caractère à la fin de la bash
ligne est utilisé pour commenter le \r
personnage, comme l'a souligné Brian Tompsett dans sa réponse . Sans cela, bash
générera une erreur si le fichier a des \r\n
fins 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 PATH
ou si vous n'avez aucun contrôle sur les commandes disponibles pour cmd
.
Utiliser echo
pour ignorer le #
personnage surcmd
Nous pouvons utiliser echo
avec sa sortie redirigée pour insérer des cmd
commandes dans bash
la 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 echo
commande et d'insérer d'autres commandes après.
#.bat
Fichier vide
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
La echo >/dev/null # 1>nul 2> #.bat
ligne crée un #.bat
fichier 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 cmd
lignes qui suivent même s'il existe une autre #
commande sur le PATH
.
La del #.bat
commande sur le cmd
code spécifique supprime le fichier qui a été créé. Vous ne devez le faire que sur la dernière cmd
ligne.
N'utilisez pas cette solution si un #.bat
fichier peut se trouver dans votre répertoire de travail actuel, car ce fichier sera effacé.
Recommandé: utiliser here-document pour ignorer les cmd
commandes surbash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
En plaçant le ^
caractère à la fin de la cmd
ligne, 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, cmd
n'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 cmd
ligne 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\n
sauts de ligne, sinon elles ne fonctionneront pas cmd
.