Hay varias formas de ejecutar diferentes comandos en bashy cmdcon el mismo script.
cmdignorará las líneas que comienzan con :;, como se menciona en otras respuestas. También ignorará la siguiente línea si la línea actual termina con el comando rem ^, ya que el ^personaje escapará del salto de línea y la siguiente línea será tratada como un comentario por rem.
En cuanto a hacer bashignorar las cmdlíneas, hay varias formas. He enumerado algunas formas de hacerlo sin romper los cmdcomandos:
#Comando inexistente (no recomendado)
Si no hay ningún #comando disponible cmdcuando se ejecuta el script, podemos hacer esto:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
El #carácter al principio de la cmdlínea hace bashque trate esa línea como un comentario.
El #carácter al final de la bashlínea se usa para comentar el \rpersonaje, como señaló Brian Tompsett en su respuesta . Sin esto, basharrojará un error si el archivo tiene \r\nfinales de línea, requeridos por cmd.
Haciendo # 2>nul , estamos engañando cmdpara ignorar el error de algún #comando inexistente , mientras seguimos ejecutando el comando que sigue.
No use esta solución si hay un #comando disponible en el PATHo si no tiene control sobre los comandos disponibles paracmd .
Usando echopara ignorar el #personaje encmd
Podemos usar echocon su salida redirigida para insertar cmdcomandos enbash el área comentada:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Dado que el #carácter no tiene un significado especial en cmd, se trata como parte del texto para echo. Todo lo que teníamos que hacer era redirigir la salida delecho comando e insertar otros comandos después.
#.batArchivo vacío
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
La echo >/dev/null # 1>nul 2> #.batlínea crea un #.batarchivo vacío mientras está encendido cmd(o reemplaza el existente#.bat , si lo hay) y no hace nada mientras está encendido bash.
Este archivo será utilizado por la cmd(s) línea (s) que sigue incluso si hay alguna otra# comando en el PATH.
El del #.batcomando en el cmdcódigo específico elimina el archivo que se creó. Solo tienes que hacer esto en la última cmdlínea.
No use esta solución si un #.batarchivo podría estar en su directorio de trabajo actual, ya que ese archivo se borrará.
Recomendado: usar here-document para ignorar cmdcomandos enbash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
Al colocar el ^carácter al final de la cmdlínea, nos escapamos del salto de línea, y al usar :como delimitador del documento aquí, el contenido de la línea delimitador no tendrá ningún efecto sobre cmd. De esa manera, cmdsolo ejecutará su línea después de: línea haya terminado, teniendo el mismo comportamiento que bash.
Si desea tener varias líneas en ambas plataformas y solo ejecutarlas al final del bloque, puede hacer esto:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Siempre que no haya una cmdlínea con exactamente here-document delimiter, esta solución debería funcionar. Puede cambiar here-document delimitera cualquier otro texto.
En todas las soluciones presentadas, los comandos solo se ejecutarán después de la última línea , lo que hace que su comportamiento sea consistente si hacen lo mismo en ambas plataformas.
Esas soluciones deben guardarse en archivos con \r\nsaltos de línea, de lo contrario no funcionarán cmd.