Існує кілька способів виконання різних команд на одному сценарії bashта cmdз ним.
cmdбуде ігнорувати рядки, які починаються з :;, як зазначалося в інших відповідях. Він також ігноруватиме наступний рядок, якщо поточний рядок закінчується командою rem ^, оскільки ^символ уникне розриву рядка, а наступний рядок буде розглядатися як коментар rem.
Що стосується змушення bashігнорувати cmdрядки, то існує кілька способів. Я перелічив кілька способів зробити це, не порушуючи cmdкоманд:
Неіснуюча #команда (не рекомендується)
Якщо під час запуску сценарію немає #доступної команди cmd, ми можемо зробити це:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
#Символ на початку cmdлінії становить bashрозглядати цей рядок як коментар.
#Символ в кінці bashрядка використовується закомментировать \rхарактер, так як Брайан Tompsett зазначив в своїй відповіді . Без цього bashвиведе помилку, якщо файл має \r\nзакінчення рядків, необхідні cmd.
Роблячи # 2>nul, ми обманюємо cmdігнорувати помилку якоїсь неіснуючої #команди, виконуючи при цьому команду, яка йде далі.
Не використовуйте це рішення, якщо на сервері є #команда PATHабо якщо у вас немає контролю над командами, доступними для cmd.
Використання echoдля ігнорування #символу наcmd
Ми можемо використовувати echoз його переспрямованим виходом для вставки cmdкоманд в область bash, що коментується:
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
Оскільки #символ не має особливого значення cmd, він трактується як частина тексту echo. Все, що нам потрібно було зробити, це перенаправити вихідні дані echoкоманди та вставити інші команди після неї.
Порожній #.batфайл
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
echo >/dev/null # 1>nul 2> #.batРядок створює порожній #.batфайл при покладеної cmd(або замінює існуючі #.bat, якщо такі є), і нічого не робить при покладеної bash.
Цей файл буде використовуватися cmdрядками, які слідують, навіть якщо на. Є якась інша #команда PATH.
del #.batКоманда на cmdПевні код видаляє файл , який був створений. Це потрібно зробити лише в останньому cmdрядку.
Не використовуйте це рішення, якщо #.batфайл міститься у вашому поточному робочому каталозі, оскільки цей файл буде стерто.
Рекомендовано: використання тут-документа для ігнорування cmdкоманд наbash
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
Розмістивши ^символ у кінці cmdрядка, ми уникаємо розриву рядка, і використовуючи :як роздільник тут документа, вміст роздільника не вплине cmd. Таким чином, він cmdбуде виконувати свій рядок лише після закінчення :рядка, маючи таку ж поведінку, як bash.
Якщо ви хочете мати кілька рядків на обох платформах і виконувати їх лише в кінці блоку, ви можете зробити це:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
Поки немає прямого cmdрядка here-document delimiter, це рішення має працювати. Ви можете перейти here-document delimiterна будь-який інший текст.
У всіх представлених рішеннях команди будуть виконуватися лише після останнього рядка , роблячи їх поведінку послідовною, якщо вони виконують одне і те ж на обох платформах.
Ці рішення потрібно зберігати у файлах із \r\nрозривами рядків, інакше вони не працюватимуть далі cmd.