バッチでフォルダを作成しますが、まだ存在しない場合のみ


440

Windowsバッチスクリプトで次のようにする方法を誰かに教えてもらえますか?(*.bat):

  • フォルダが存在しない場合にのみ作成します

さらに詳しく言えばVTSC:\ドライブ上に名前の付いたフォルダを作成したいのですが、そのフォルダがまだ存在していない場合のみです。フォルダーが既に存在し、バッチが実行されている場合、フォルダーの内容を上書きしたくありません。


2
これはどう ? if not exist "%Folder%" mkdir "%New-Folder%"
scientist_7

回答:


622

これを使用するif not exist "C:\VTS\" mkdir C:\VTSだけです。フォルダが存在しない場合にのみディレクトリを作成します。

この存在テストは、VTSが存在し、ディレクトリである場合にのみtrueを返すことに注意してください。そこにない場合、またはファイルとして存在する場合は、mkdirコマンドが実行され、エラーが発生します。VTSがファイルとして存在するかどうかを確認することもできます。


7
それが間違っていることを除いて。NULデバイスを確認する必要があります。そうしないと機能しません。これより3年早く私の答えを見てください。
Martin Schapendonk 2016

@MartinSchapendonkこれは、テストからわかる限り、Windows 7とWindows Server 2012で動作します。少なくともXPからWindows 10まで動作しない場合、私は非常に驚きます。これは機能しませんか?
jpmc26 2016年

12
@ jpmc26 NULのテストは、ディレクトリをテストすることを確認することです。それ以外の場合、通常のファイルであっても、条件がtrueと評価される場合があります。それが違いです。
Martin Schapendonk 2016年

3
@MartinSchapendonk末尾にスラッシュを追加するだけで十分ですか?それはファイルとディレクトリを正しく区別しているようですが、ファイルが検出されない場合、ディレクトリの作成が失敗するという弱点があります。これNULものテストの問題だと思います。
jpmc26 2016年

6
@ jpmc26正解です。末尾のスラッシュが機能します。引用符を使用できるため、実際にはディレクトリパスにスペースを含めることができるので、スラッシュを使用することをお勧めします。どちらかのファイル/ディレクトリを区別するために、これは機能します:if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir")。あなたの最後の文について、私はどこかであなたのバッチファイルに問題があると思います。
2377

221
if exist C:\VTS\NUL echo "Folder already exists"

if not exist C:\VTS\NUL echo "Folder does not exist"

https://support.microsoft.com/en-us/kb/65994も参照してください

(2018年3月7日更新、Microsoftの記事はダウンしています。https://web.archive.org/web/20150609092521/https://support.microsoft.com/en-us/kb/65994にアーカイブしてください


12
個人的には、dirが既に存在する場合に%errorlevel%を設定しないので、これを好みます(Agent_9191の回答はエラーコード1を返します)
csauve

1
それはまた素晴らしく一般的で、条件付きで実行したい他のすべてのアクションに適用できます:)
John Humphreys-w00te

3
@YouHaveaBigEgoはNUL1 L.である
マーティンSchapendonk


3
実際、この回答は素晴らしいものですが、「ディレクトリを作成する」という質問には回答しません:)
Jean-Francois T.

55

mkdir C:\VTS何があっても電話してください。サブディレクトリがすでに存在することを報告するだけです。

編集:他の人が指摘したように、フォルダが既に存在する場合、これは%ERRORLEVEL%を設定します。バッチ(またはそれを呼び出すプロセス)がエラーレベルを気にしない場合、このメソッドは適切に機能します。質問ではエラーレベルを回避することについて言及されていないため、この回答は完全に有効です。フォルダーが存在しない場合、フォルダーを作成するニーズを満たし、既存のフォルダーの内容を上書きしません。それ以外の場合は、Martin Schapendonkの回答に従ってください


20
これは、予期しないエラーメッセージ/警告による悪い動作です。
SeriousM 2013

10
ベストプラクティスに違反しているときに「完全に有効」なものを呼び出すことは、知的に不正です。別の例として:特定の特定のセキュリティ問題を回避する方法を誰かから尋ねられた場合、質問が最低限のセキュリティへの影響を前提条件として明示的に指定していなくても、「コンピュータを管理者として実行する」ことはできません。:-)
Jouni Heikniemi 2014年

2
@JouniHeikniemi s /ベストプラクティス/ Jouniの個人的な好み
dss539

4
Errorlevelまたはerrnoに問題はありません。これらはプラットフォーム固有のエラーメッセージングパラダイムであり、それらが構築された目的で機能します。しかし、プラットフォームやメッセージングのアプローチが何であっても、一般的なエラーのケースを簡単に回避できるため、「これを実行して失敗した場合に回復する」というパターンはお勧めできません。したがって、「存在しない場合」スタイルのアプローチの方が優れていると思います。しかし、私はベストプラクティスの形成についての議論に深く入り込みたくはありません。私は誰かの気分を害するつもりはなく、自分の反対票を明確にしたかっただけです。
Jouni Heikniemi 2015

4
単にエラーを無視することの問題は、なぜ失敗したの分からないことです。ディレクトリが既に存在していたか、ユーザーにそのディレクトリに対する権限がないか、親パスが存在しなかったか、ディスクに障害が発生したため、失敗した可能性があります。「存在しない場合は作成」は、最初の場合を除くすべてのケースで失敗するはずです。ただし、この回答はすべての場合でエラーになります。そのため、バッチスクリプトには適していません。-1
jpmc26 2016年

38
mkdir C:\VTS 2> NUL

というフォルダを作成し、にVTS出力A subdirectory or file TEST already existsNULます。

または

(C:&(mkdir "C:\VTS" 2> NUL))&

ドライブ文字を変更C:mkdir出力誤差にNULし、次のコマンドを実行します。


これをPowerShellで機能させる方法はありますか?NUL出力ファイルとしてサポートしていないようです。
アーロンフランケ

30
set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)

1
他の人が指摘し、あなたが最高評価の回答を見たかもしれないので、という名前のファイルがある場合、これは機能しませんlog。これは微妙な違いですが、スクリプトで見つけにくいバグにつながります。
アベル

20

私はこの方法を使用し、あなたがすべきディレクトリ名の末尾にバックスラッシュを入れて使用することはありません、その場所が指定したディレクトリと同じ名前で拡張子のないファイル内に存在を避けるために、「C:\ VTS」を、ファイルをことができるので、名前で存在「VTS」に保存された「C:」パーティション、正しい方法を使用することです「C:\ VTS \」の後にバックスラッシュをチェックアウト、VTSので、正しい方法です。

@echo off
@break off
@title Create folder with batch but only if it doesn't already exist - D3F4ULT
@color 0a
@cls

setlocal EnableDelayedExpansion

if not exist "C:\VTS\" (
  mkdir "C:\VTS\"
  if "!errorlevel!" EQU "0" (
    echo Folder created successfully
  ) else (
    echo Error while creating folder
  )
) else (
  echo Folder already exists
)

pause
exit

3
あなたのソリューションで特に興味深いのは、を使用すること!errorlevel!、つまり拡張の遅延です。それ以外の場合、変数ERRORLEVELは最初に入る前にif(つまり、解析時に)解析されます。現在は実行時に解析されるため、の結果を取得できmkdirます。また、存在をテストしても、成功をテストする必要があります(たとえば、アクセス拒否エラーなど)。他に比べて非常に良い解決策+10 !!!
アベル

17

以下を使用できます。

if not exist "C:\VTS\" mkdir "C:\VTS"

また、コードを展開して、予期しないファイルを置き換えることもできます。

if not exist "C:\VTS\important.file" echo. > "C:\VTS\important.file"

0

アイビームの仕事で使用するスクリプト用に作成しました。

:CREATES A CHECK VARIABLE

set lookup=0

:CHECKS IF THE FOLDER ALREADY EXIST"

IF EXIST "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\" (set lookup=1)

:IF CHECK is still 0 which means does not exist. It creates the folder

IF %lookup%==0 START "" mkdir "%UserProfile%\AppData\Local\CounterPath\RegNow Enhanced\default_user\"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.