Existem várias maneiras de executar comandos diferentes sobre bashe cmdcom o mesmo script.
cmdirá ignorar as linhas que começam com :;, conforme mencionado em outras respostas. Ele também irá ignorar a próxima linha se a linha atual terminar com o comando rem ^, pois o ^caractere escapará da quebra de linha e a próxima linha será tratada como um comentário de rem.
Quanto a fazer bashignorar as cmdlinhas, existem várias maneiras. Eu enumerei algumas maneiras de fazer isso sem quebrar os cmdcomandos:
#Comando inexistente (não recomendado)
Se não houver nenhum #comando disponível cmdquando o script for executado, podemos fazer o seguinte:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
O #caractere no início da cmdlinha faz com bashque trate essa linha como um comentário.
O #personagem no final da bashlinha é usado para comentar o \rpersonagem, como Brian Tompsett apontou em sua resposta . Sem isso, bashserá gerado um erro se o arquivo tiver \r\nterminações de linha, exigidas por cmd.
Ao fazer # 2>nulisso, estamos enganando cmdpara ignorar o erro de algum #comando inexistente , enquanto ainda executamos o comando a seguir.
Não use esta solução se houver um #comando disponível no PATHou se você não tiver controle sobre os comandos disponíveis para cmd.
Usando echopara ignorar o #personagem emcmd
Podemos usar echocom sua saída redirecionada para inserir cmdcomandos na bashárea comentada de:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Como o #caractere não tem nenhum significado especial cmd, ele é tratado como parte do texto para echo. Tudo o que precisamos fazer é redirecionar a saída do echocomando e inserir outros comandos depois dele.
#.batArquivo vazio
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
A echo >/dev/null # 1>nul 2> #.batlinha cria um #.batarquivo vazio enquanto ligado cmd(ou substitui o existente #.bat, se houver) e não faz nada enquanto está ligado bash.
Este arquivo será usado pela cmd(s) linha (s) que segue, mesmo se houver algum outro #comando no PATH.
O del #.batcomando no cmdcódigo específico exclui o arquivo que foi criado. Você só precisa fazer isso na última cmdlinha.
Não use esta solução se um #.batarquivo puder estar em seu diretório de trabalho atual, pois esse arquivo será apagado.
Recomendado: usar here-document para ignorar cmdcomandos embash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
Ao colocar o ^caractere no final da cmdlinha, estamos escapando da quebra de linha e usando :como delimitador here-document, o conteúdo da linha delimitadora não terá efeito cmd. Dessa forma, cmdsó executará sua linha após o término da :linha, tendo o mesmo comportamento que bash.
Se quiser ter várias linhas em ambas as plataformas e executá-las apenas no final do bloco, você pode fazer o seguinte:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Desde que não haja uma cmdlinha exata here-document delimiter, essa solução deve funcionar. Você pode mudar here-document delimiterpara qualquer outro texto.
Em todas as soluções apresentadas, os comandos só serão executados após a última linha , tornando seu comportamento consistente se fizerem a mesma coisa nas duas plataformas.
Essas soluções devem ser salvas em arquivos com \r\nquebras de linha, caso contrário, não funcionarão cmd.