Кілька команд на одному рядку в пакетному файлі Windows


111

У Unix ми можемо поставити кілька команд в один рядок, як це:

$ date ; ls -l ; date

Я спробував подібне в Windows:

 > echo %TIME% ; dir ; echo %TIME

Але він надрукував час і не виконує команду dir.

Як я можу цього досягти?


Відповіді:


181

Використання:

echo %time% & dir & echo %time%

Це, з пам’яті, еквівалент роздільника напівколонки в bashінших оболонках UNIXy.

Існує також &&(або ||), яка виконує другу команду лише в тому випадку, коли перша вдалася (або зазнала невдачі), але один амперсанд &- це те, що ви шукаєте тут.


Це, ймовірно, дасть вам той самий час, однак змінні середовища, як правило, оцінюються на читання, а не на виконання.

Ви можете подолати це, увімкнувши затримку розширення:

pax> cmd /v:on /c "echo !time! & ping 127.0.0.1 >nul: & echo !time!"
15:23:36.77
15:23:39.85

Це потрібно з командного рядка. Якщо ви робите це всередині сценарію, ви можете просто використовувати setlocal:

@setlocal enableextensions enabledelayedexpansion
@echo off
echo !time! & ping 127.0.0.1 >nul: & echo !time!
endlocal

Дякую за відповідь. Проблема в тому, що вона працює частково. перший та останній% time% друкує той самий час, навіть коли команда (посередині) займає принаймні 40 секунд (я запускаю сценарій замість команди dir)
Рагурам

1
Це тому, що змінні середовища оцінюються, коли команда читається, а не виконується. Я оновлю відповідь.
paxdiablo

Тим не менш, проблема зберігається. Сценарій закінчується кодом 1. Але все ж друге відлуння друкує той самий час. Дивіться цю оп. 12: 57: 56.93 Потік, який вийшов під час запуску 3 потоків. 12: 57: 56,93
Raghuram

3
Я прагнув використовувати time /t(або echo.|time) замість того, echo %time%щоб обійти проблему.
Джої

1
Будь-яка ідея, як отримати% errorlevel%, щоб бути правильним при наступних дзвінках?
БредЛані
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.