Несколько команд в одной строке командного файла 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)
Raghuram

1
Это потому, что переменные среды оцениваются, когда команда читается, а не выполняется. Обновлю ответ.
paxdiablo

Тем не менее проблема не устранена. Сценарий завершается с кодом 1. Но второе эхо по-прежнему выводится в то же время. См. Эту операцию 12: 57: 56.93. Поток завершился, пока выполнялись 3 потока. 12: 57: 56,93
Raghuram

3
Я был склонен использовать time /t(или echo.|time) вместо того, echo %time%чтобы обойти проблему.
Joey

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