Windowsにディレクトリが存在するかどうかを確認する方法は?


59

このLinux / BashスクリプトをWindowsシェルに変換したいと思います。

if test -d myDirName; then echo "ok"; else mkdir myDirName; fi

ディレクトリが存在するかどうかをテストし、存在しない場合は作成します。


3
実際のlinux / bashコマンドは次のようになりますmkdir -p myDirName。比較的単純なbashスクリプトをbatch-sh * tに変換しようとして(関数の結果を変数に割り当てますか?)
マイケル

回答:


73
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

Barlopが追加

上記はこの特定の状況で機能しますが、タイトルはディレクトリ専用のテストについて説明しています。Phoggのコメントを使用if exist mydirname\するのでif exist mydirnameはなく、使用しています。一部の回答では\ nulを使用していますが、NTでは\ nulに問題があります。末尾のバックスラッシュを含めない場合、ファイルまたはディレクトリをテストします。したがって、ディレクトリの場合は、末尾のバックスラッシュを含めます。


23
これはファイルの存在をテストするのに正しいですが、それがディレクトリであることをどのように知っていますか?if exist mydirname\ あなたが言うように、最も簡単な答えは残りです。または、実際にtestバイナリを取得してWindowsで使用することもできます。
phogg

@phogg:この特定の質問のコンテキストでは:ファイルが存在する場合でも、それできませんmkdir
grawity

@grawity:存在するがファイルである場合、スクリプトは後でディレクトリとして使用しようとすると失敗する可能性があります。
phogg

存在しない場合はどうすれば確認できますか?
スングクリム14

1
myDirNameを\ `同様に存在しない場合は`書き込むことによって@sunglim if not 1==1 echo hmm またはmyDirNameの\ ELSEのblahblahblah存在する場合
barlop

20

ここに私が見つけたものがあります:

NULファイルが存在するかどうかをテストできます。ディレクトリが存在する場合、nulファイルが含まれます。nulファイルが存在しない場合、ディレクトリは存在しません。

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

2
+1- if exist dirnameこれは、Windows NT固有のように見えるプレーンとは異なり、すべてのWindowsおよびMS-DOSバージョンで機能します。
grawity

P:それのは愚かなコードがMKDIR -p myDirNameをLinuxに比較した
キットホー

6
スラッシュではなくバックスラッシュである必要があります。
ネイサンガラベディアン

@grawityこれについてはどう思いますか?dostips.com/forum/viewtopic.php?f=3&t=4913
barlop

@barlop:cmd.exeは現存する最悪のスクリプト言語の1つであり、可能であればPowerShellまたは他の代替手段を使用する必要があると思います。については\nul、Windows NTではもう必要ありませif exist "C:\Program Files (x86)"ん。(Windows 98をターゲットにしている場合を除き...)
grawity 14年

11

バックスラッシュではなくスラッシュを使用しますmyDirName\nulありませんmyDirName/nul

md foo 
echo.>bar 
for %I in (foo bar xyz) do @( 
  if exist %I ( 
    if exist %I\nul ( 
      echo -- %I is a directory 
    ) else ( 
      echo -- %I is a file 
    ) 
  ) else ( 
    echo -- %I does not exist 
  ) 
)

-fooはディレクトリ
です
-barはファイルです-xyzは存在しません

編集:これは、ディレクトリ名にスペースが含まれていない場合にのみ機能します


5

\ nulを実行することを提案した人もいますが、それはNTでは確実に動作しないようです

C:\blah>md abc

C:\blah>if exist abc\nul echo yes
yes

C:\blah>if exist "abc\nul" echo yes

C:\blah>

http://www.dostips.com/forum/viewtopic.php?f=3&t=4913

foxidrive writes-

The trick with nul worked in pre NT versions of windows.

Now you would use this, with a trailing backslash.

if exist "C:\abcde\" echo the folder exists

質問を再

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
no

C:\blah>if exist "abcd\" (echo yes) else (echo no && mkdir abcd)
yes

C:\blah>

4

私はWindows 7で同じ種類の問題を経験していたので、ジョーがなぜダウン投票したのか疑問に思いました

存在する場合filename \ NUL

ファイルとディレクトリの両方に対してTRUEを返していました。www.robvanderwoude.com/battech_ifexistfolder.phpで代替ソリューションを見つけ、DVFのFORループの改訂版を思い付きました。

FOR %I in (foo bar xyz) DO @( PUSHD %I && (POPD & echo -- %I is a directory) || ( IF exist %I ( echo -- %I is a file ) ELSE ( echo -- %I does not exist ) ) )

これが唯一の解決策でした、ありがとう。エラーメッセージを回避するために「2> NUL」を追加し、エコー値を1(ディレクトリが存在する)、0(ディレクトリが存在しない)、-1(同じ名前のファイルが存在する)に変更しましたFOR%A IN( " C:\ temp \ foo \ HELLO WORLD5 ")DO @(PUSHD"%A "2> NUL &&(POPD&ECHO 1)||(IF EXIST%A(ECHO -1)ELSE(ECHO 0
Christoph

(申し訳ありませんが、返信でコードとしてコードをフォーマットすることはできませんでしたが、非常に多くのことを試してみました:-( 5分後にタイムアウトするコメントの編集まで:
Christoph

1

多くの場合、ファイルとフォルダーの区別に問題があります。誰かが存在することを確認した後、単純にCDに入れようとしましたか?その後、cdは成功または失敗します。

set MyDir = "MyTestDir"
IF exist MyDir (
    cd MyDir 
    IF ERRORLEVEL NEQ 0 (
        echo "Error: %MyDir% already exists, but it is a file!"
        exit 1
    ) else (
        # Do not forget to cd back
        cd ..
    )
) else (
   # Did not exist yet, so create it.
   mkdir MyDir
)

(1)変数を使用する場合は、変数を使用します。MyDir最初の行の後のすべての出現はでなければなりません%MyDir%。(2)複数レベルのパス名(例:)または絶対パス名(例:)であるcd ..場合、必要な処理は行われません 。/ および/またはの使用を検討してください。%MyDir%Pictures\cats\Windowspushdpopdsetlocal
スコット14年

0
exist myDirName/nul

また、myDirNameがファイルの場合はtrueになりますが、whisは検索された機能ではありません


1
C:\blah>touch abe<ENTER>C:\blah>if exist abe\nul echo err<ENTER> C:\blah>if exist abe/nul echo err<ENTER>C:\blah>私はNTでは\ nulのファンではありませんが、そうではありません。出力が必要です。
barlop

-1

フォルダを見つけるのはそれほど難しくないはずです。私の解決策は、perlを使用します。

for($ cnt = $#ARGV; $ cnt> = 0;-$ cnt)
{
   if(-d "$ ARGV [$ cnt]"){ 
      print "argv [$ cnt] = $ ARGV [$ cnt]はフォルダーです\ n";
      $ dir = $ ARGV [$ cnt];
      ブレーク;
   } else {
      print "argv [$ cnt] = $ ARGV [$ cnt]はフォルダではありません\ n";
   }
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.