Windowsバッチファイルの1行に複数のコマンド


111

Unixでは、次のように複数のコマンドを1行で入力できます。

$ date ; ls -l ; date

私はWindowsで同様のことを試しました:

 > echo %TIME% ; dir ; echo %TIME

しかし、それは時間を出力し、コマンドを実行しませんdir

どうすればこれを達成できますか?


回答:


181

使用する:

echo %time% & dir & echo %time%

これは、メモリからは、bashおよび他のUNIXシェルのセミコロン区切り文字と同等です。

また、最初のコマンドが成功(または失敗)した場合にのみ2番目のコマンドを実行する&&(または||)もあり&ますが、ここでは単一のアンパサンドを探しています。


ただし、環境変数は実行ではなく読み取り時に評価される傾向があるため、同じ時間になる可能性があります。

遅延拡張をオンにすることでこれを回避できます。

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 2012年

それでも問題は解決しません。スクリプトはコード1で終了しますが、それでも2番目のエコーが同時に出力されます。この操作を参照してください12:57:56.93 3つのスレッドの実行中にスレッドが終了しました。12:57:56.93
Raghuram

3
私は問題を回避する代わりにtime /t(またはecho.|time)を使用する傾向がありましたecho %time%
Joey

1
次の呼び出しで%errorlevel%を正しくする方法はありますか?
BradLaney 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.