web-dev-qa-db-ja.com

Windowsバッチファイルを使用した複数のコマンドを含む1行

バッチファイルの単一のコマンドラインで複数のコマンドがどのように機能するかを理解しようとしています。

dir & md folder1 & rename folder1 mainfolder

同様のコマンドを使用する他のケースですが、&&&に置き換えられます。

dir && md folder1 && rename folder1 mainfolder

1。この2つのケースの違いは何ですか?


私が聞きたい他のこと:

ワンライナーbatch.bat

dir & md folder1 & rename folder1 mainfolder

マルチライナーbatch.bat

dir
md folder1
rename folder1 mainfolder

2。このワンライナーとマルチライナーは、バッチファイルプロシージャに関して同じですか?


そして、もう1つ知っておきたいことがあります。

3。main.batから他のバッチファイルを呼び出した場合、それらは独立して同時に実行されますか?メインバッチファイルは他のバッチファイルの手順の終了を待機しませんか?方法それをしますか?

16
Quanti Monati

2つのコマンドの間に&を指定すると、最初のコマンドの結果に関係なく、両方のコマンドが実行されます。 &の右側のコマンドは、&の左側のコマンドが前のコマンドの成功またはエラーに関係なく終了した後に実行されます。つまり、前のコマンドの終了/戻り値に関係なく実行されます。

&&を指定すると、2番目のコマンドが条件付きで実行されます。 2番目のコマンドは、最初のコマンドが成功した場合にのみ実行されます。つまり、戻りコード0で終了しました。

別の説明については、「 条件付き実行 」を参照してください。

dir & md folder1 & rename folder1 mainfolder

したがって等しい

dir
md folder1
rename folder1 mainfolder

複数行の置換

dir && md folder1 && rename folder1 mainfolder

だろう

dir
if not errorlevel 1 (
   md folder1
   if not errorlevel 1 (
      rename folder1 mainfolder
   )
)

if not errorlevel 1は、以前に実行したコマンドを意味しますnot終了コードで終了しますより大きい。コマンドdirおよびmdは負の値で終了することはなく、0以上(ほぼすべてのコマンドとコンソールアプリケーションと同様)および値が成功の終了コードであるため、これは正しい方法です。 dirおよびmdが正常に実行されたかどうかをテストします。 Microsoftサポート記事 バッチファイルの特定のエラーレベルのテスト を参照してください。

エラーレベルに関するその他の役立つスタックオーバーフロートピック:

無条件演算子&&&||などの条件演算子を混在させる場合は、実行順序が必ずしもコマンドラインでのコマンドの順序とは限らないため、注意が必要です。

例:

dir "C:\Users\%UserName%" /AD 2>nul || dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%"

このコマンドラインは次のように実行されます。

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 dir "%UserProfile%" /AD
echo User profile path: "%UserProfile%"

[〜#〜] echo [〜#〜]コマンドは、最初の[~~~~ dir [〜#〜]の実行結果に関係なく常に実行されます[〜#〜] dir [〜#〜]は、Windowsのように最初に失敗した場合にのみ実行されます[〜#〜] dir [〜#〜]失敗XPまたはユーザーのプロファイルフォルダーがドライブCにないか、フォルダーUsersにまったくない。

実行時に(および)を使用する必要があります[〜#〜] echo [〜#〜]最初の場合のみ[〜#〜] dir [ 〜#〜]秒後に失敗[〜#〜] dir [〜#〜]秒の結果に依存しない[〜#〜] dir [〜#〜] =。

dir "C:\Users\%UserName%" /AD 2>nul || ( dir "%UserProfile%" /AD & echo User profile path: "%UserProfile%" )

このコマンドラインは次のように実行されます。

dir "C:\Users\%UserName%" /AD 2>nul
if errorlevel 1 (
    dir "%UserProfile%" /AD
    echo User profile path: "%UserProfile%"
)

3番目の質問の答えについては、私の回答を参照してください 現在のバッチファイルの親フォルダーにあるバッチファイルを呼び出す方法? ここで、コマンドcallまたはstartまたはバッチファイル内からこれらの2つのコマンドはありません。

26
Mofi