Ce que j'ai fait, c'est utiliser la syntaxe de l'étiquette de cmd comme marqueur de commentaire . Le caractère d'étiquette, un deux-points ( :
), est équivalent à true
dans la plupart des shells POSIX. Si vous suivez immédiatement le caractère d'étiquette par un autre caractère qui ne peut pas être utilisé dans une commande de type GOTO
puis en commentant votre cmd
script ne devraient pas affecter votre cmd
code.
L'astuce consiste à placer des lignes de code après la séquence de caractères " :;
". Si vous écrivez principalement des scripts en une seule ligne ou, comme cela peut être le cas, si vous pouvez écrire une ligne de sh
pour de nombreuses lignes de cmd
la solution suivante pourrait convenir. N'oubliez pas que toute utilisation de $?
doit être avant votre prochain colon :
parce que :
réinitialise $?
à 0.
:; echo "Hi, I’m ${SHELL}."; exit $?
@ECHO OFF
ECHO I'm %COMSPEC%
Un exemple très artificiel de gardiennage $?
:
:; false; ret=$?
:; [ ${ret} = 0 ] || { echo "Program failed with code ${ret}." >&2; exit 1; }
:; exit
ECHO CMD code.
Une autre idée pour passer outre cmd
est d'utiliser heredocs de sorte que sh
traite les cmd
comme une chaîne inutilisée et cmd
l'interprète. Dans ce cas, nous veillons à ce que le délimiteur de notre heredoc soit à la fois entre guillemets (pour empêcher les sh
de faire n'importe quelle sorte d'interprétation sur son contenu lorsqu'il est exécuté avec sh
) et commence par :
de sorte que cmd
passe dessus comme n'importe quelle autre ligne commençant par :
.
:; echo "I am ${SHELL}"
:<<"::CMDLITERAL"
ECHO I am %COMSPEC%
::CMDLITERAL
:; echo "And ${SHELL} is back!"
:; exit
ECHO And back to %COMSPEC%
En fonction de vos besoins ou de votre style de codage, les entrelacs cmd
y sh
Le code peut ou non avoir un sens. L'utilisation des hérédocs est une méthode pour réaliser un tel entrelacement. Cette méthode pourrait toutefois être étendue avec l'option GOTO
technique :
:<<"::CMDLITERAL"
@ECHO OFF
GOTO :CMDSCRIPT
::CMDLITERAL
echo "I can write free-form ${SHELL} now!"
if :; then
echo "This makes conditional constructs so much easier because"
echo "they can now span multiple lines."
fi
exit $?
:CMDSCRIPT
ECHO Welcome to %COMSPEC%
Les commentaires universels, bien sûr, peuvent être faits avec la séquence de caractères : #
o :;#
. L'espace ou le point-virgule sont nécessaires car sh
considère #
pour faire partie du nom d'une commande s'il n'est pas le premier caractère d'un identifiant. Par exemple, vous pourriez vouloir écrire des commentaires universels dans les premières lignes de votre fichier avant d'utiliser la commande GOTO
pour diviser votre code. Vous pourrez alors informer votre lecteur de la raison pour laquelle votre script est écrit si bizarrement :
: # This is a special script which intermixes both sh
: # and cmd code. It is written this way because it is
: # used in system() shell-outs directly in otherwise
: # portable code. See https://stackoverflow.com/questions/17510688
: # for details.
:; echo "This is ${SHELL}"; exit
@ECHO OFF
ECHO This is %COMSPEC%
Ainsi, quelques idées et moyens d'accomplir sh
y cmd
-compatible scripts sans effets secondaires sérieux pour autant que je sache (et sans avoir cmd
sortie '#' is not recognized as an internal or external command, operable program or batch file.
).