2010-12-06 16:36:13 +0000 2010-12-06 16:36:13 +0000
64
64

Wie kann man überprüfen, ob ein Verzeichnis unter Windows existiert?

Ich möchte dieses Linux/Bash-Skript in die Windows-Shell übersetzen:

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

Es testet, ob ein Verzeichnis existiert, und wenn nicht, erstellt es dieses.

Antworten (9)

79
79
79
2010-12-06 16:47:52 +0000
@echo off
IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)

Added by Barlop

Während das oben Gesagte für diese spezielle Situation funktioniert, sagt der Titel über das Testen speziell für ein Verzeichnis aus. Phogg’s Kommentar mit if exist mydirname @echo off IF exist myDirName ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created) `

Added by Barlop

Während das oben Gesagte für diese spezielle Situation funktioniert, sagt der Titel über das Testen speziell für ein Verzeichnis aus. Phogg’s Kommentar mit statt if exist mydirname ist der richtige Weg. Einige Antworten haben \nul verwendet, aber \nul ist in NT problematisch. Das Fehlen eines abschließenden Backslash wird für eine Datei oder ein Verzeichnis getestet. Fügen Sie also für ein Verzeichnis den abschließenden Backslash ein.

21
21
21
2011-12-06 11:52:52 +0000

Hier ist, was ich gerade herausgefunden habe:

Sie können testen, ob eine Nulldatei existiert; wenn das Verzeichnis existiert, wird es eine Nulldatei enthalten, wenn die Nulldatei nicht existiert, dann existiert das Verzeichnis nicht.

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
11
11
11
2012-05-12 15:36:37 +0000

Verwenden Sie einen umgekehrten Schrägstrich, keinen Schrägstrich vorwärts: myDirName\nul nicht 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 ist ein Verzeichnis – bar ist eine Datei – xyz existiert nicht

edit: dies funktioniert nur, wenn der Verzeichnisname keine Leerzeichen enthält

5
5
5
2014-06-03 11:10:57 +0000

Einige haben vorgeschlagen, \nul zu tun, aber das scheint in NT

C:\blah>md abc

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

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

C:\blah>

nicht zuverlässig zu funktionieren 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

Re the question

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
4
4
2013-10-11 11:29:44 +0000

Ich fragte mich, warum Joe eine Abwärtsstimme hatte, da ich unter Windows 7 die gleiche Art von Problem hatte, nämlich dass

IF EXIST filename\NUL

sowohl für Dateien als auch für Verzeichnisse TRUE zurückgab. Ich fand eine alternative Lösung unter www.robvanderwoude.com/battech_ifexistfolder.php und erstellte eine überarbeitete Version der FOR-Schleife des DVF:

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 ) ) )
1
1
1
2014-06-03 09:50:53 +0000

Ich sehe, dass viele Probleme mit der Unterscheidung zwischen Dateien und Ordnern haben. Hat jemand versucht, nach der Überprüfung der Existenz einfach eine CD einzuspielen? Dann wird cd entweder erfolgreich sein oder fehlschlagen.

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
)
0
0
0
2019-11-09 14:56:24 +0000

Ich bevorzuge die Verwendung von dir /d | findstr \[\.\.\]:

2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName&&echo= Is NOT dir

2>nul dir /d "myDirName" | findstr \[\.\.\] >nul && echo= "ok" || mkDir myDirName

Für erstellen, ob vorhanden oder nicht und für Fehler ignorieren…

2>nul mkDir myDirName

Auch …

if exist "myDirName\." (echo/"ok") else mkdir myDirName

rem :: or direct create myDirName hidden/ignoring error
       2>nul mkdir myDirName & if exist "myDirName\." echo/ exist 
rem :: output: exist
0
0
0
2012-05-04 10:41:48 +0000
exist myDirName/nul

trifft auch zu, wenn myDirName eine Datei ist, was nicht die gesuchte Funktionalität ist

-1
-1
-1
2018-08-24 18:31:30 +0000

Einen Ordner zu finden, sollte nicht so schwierig sein. Meine Lösung, benutze perl:

for($cnt=$#ARGV; $cnt\>=0; --$cnt) { if ( -d "$ARGV[$cnt]" ) { print "argv[$cnt]=$ARGV[$cnt] is a folder\n"; $dir = $ARGV[$cnt]; break; } else { print "argv[$cnt]=$ARGV[$cnt] is Not a folder\n"; } }