web-dev-qa-db-ja.com

バッチスクリプトでフォルダーを作成し、存在する場合は無視する

バッチスクリプトでフォルダー(およびサブフォルダー)を作成するにはどうすればよいですか?重要なことは、フォルダー(またはサブフォルダー)が既に存在する場合、エラーを返さないことです。

たとえば、次のようなもの:

  • mkdir mydir-成功(ディレクトリが作成されました)
  • mkdir mydir\subdir-成功(現在はmydirにはsubdirが含まれています)
  • mkdir mydir-成功(フォルダはすでに存在しますnotエラーをスローします)
  • mkdir mydir\subdir-成功(フォルダはすでに存在しますnotエラーをスローします)

私が実際に必要なのは、フォルダ構造が存在することを保証することだけです。

3
steavy

ディレクトリ構造を作成する標準的な方法は次のとおりです。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"

md "%Directory%" 2>nul
if not exist "%Directory%\*" (
    echo Failed to create directory "%Directory%"
    pause
    goto :EOF
)

rem Other commands after successful creation of the directory.
endlocal

デフォルトでは、コマンド拡張は有効になっており、遅延拡張は無効になっています。上記のバッチコードは、この環境を明示的に設定します。

コマンド[〜#〜] md [〜#〜]は、有効なコマンド拡張機能を使用して、指定されたディレクトリに完全なディレクトリ構造を作成します。

[〜#〜] md [〜#〜]は、ディレクトリが既に存在する場合にエラーを出力します。これは、ユーザーがコマンドを手動で入力するときに、入力したディレクトリパスに間違いがある可能性があることを通知するのに役立ちます。ユーザーが新しいディレクトリを作成したくて、既存のディレクトリの名前を誤って入力した可能性があるためです。

しかし、コマンドのスクリプト化された使用法[〜#〜] md [〜#〜]の場合、このコマンドがエラーメッセージを出力することがよくあります。作成する存在は既に存在します。コマンド[〜#〜] md [〜#〜]に、ディレクトリの場合にエラーメッセージを出力しないオプションがあると、非常に役立ちます。この場合、既存のものを作成し、戻りコード0で終了します。しかし、そのようなオプションはありません。

上記のソリューションはディレクトリを作成し、ハンドル[〜#〜] stderr [〜#〜]からデバイス[〜#〜] nul [〜#〜]

ただし、ディレクトリパスに無効な文字が含まれているため、ディレクトリの作成が失敗する可能性があります。ドライブが使用できません(フルパスを使用している場合)。指定されたディレクトリの名前のファイルがパスのどこかにあります。NTFSの権限では、ディレクトリの作成が許可されていません。 、など.

したがって、ディレクトリが実際に存在するかどうかを確認することをお勧めします。

if not exist "%Directory%\*"

ディレクトリパスが\*または少なくともバックスラッシュで終了していることが重要です。そうでない場合、例では、ディレクトリsubdir 2mydir\subdir 1という名前のファイルが存在する可能性があります。これは、条件の使用時にif not exist "%Directory%"が、ディレクトリがない場合でもfalseと評価されますsubdir 2

もちろん、最初にディレクトリチェックを行い、まだ存在しない場合はディレクトリを作成することもできます。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"

if not exist "%Directory%\*" (
    md "%Directory%"
    if errorlevel 1 (
        pause
        goto :EOF
    )
)

rem Other commands after successful creation of the directory.
endlocal

ディレクトリ構造を簡単に作成できなかった場合、ユーザーはコマンド[〜#〜] md [〜#〜]によって出力されたエラーメッセージを表示できます。理由。

このバッチコードは、演算子||を使用してよりコンパクトに記述できます。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Directory=mydir\subdir 1\subdir 2"

if not exist "%Directory%\*" md "%Directory%" || pause & goto :EOF

rem Other commands after successful creation of the directory.
endlocal

演算子||および&の詳細については、回答を読んでください Windowsバッチファイルを使用した複数のコマンドを含む1行

コマンド[〜#〜] endlocal [〜#〜]goto:EOF の前には使用されません有効なコマンド拡張。 Windowsコマンドインタープリターは、バッチファイルの実行を終了するときに暗黙的にこのコマンドを実行します。

使用するコマンドとその機能を理解するには、コマンドプロンプトウィンドウを開き、そこで次のコマンドを実行し、各コマンドについて表示されるすべてのヘルプページをよく読みます。

  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • md /?
  • pause /?
  • set /?
  • setlocal /?

コマンドリダイレクト演算子の使用 に関するMicrosoftの記事も読んでください。

6
Mofi

パスを確認し、存在しない場合は作成する必要があります

if not exist mydir\subdir md mydir\subdir

または、stderrをリダイレクトすることもできます

md mydir\subdir 2>NUL

最初にmkdir mydirを実行する必要はありません。

MDは、必要に応じて、パスに中間ディレクトリを作成します。

コマンド拡張が有効な場合

https://ss64.com/nt/md.html

9
phuclv