Wie überprüfe ich, ob ein Verzeichnis in Windows existiert?

59

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

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

Es wird geprüft, ob ein Verzeichnis vorhanden ist, und wenn nicht, wird es erstellt.

Pietro
quelle
3
Der eigentliche Linux / bash Befehl würde einfach sein: mkdir -p myDirName. Nachdem ich tagelang versucht hatte, relativ einfache Bash-Skripte in Batch-Sh * T zu übersetzen (das Ergebnis einer Funktion einer Variablen zuzuweisen?), Habe ich mich dazu entschlossen, nur Leute dazu zu bringen, Cygwin zu installieren.
Michael

Antworten:

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

Hinzugefügt von Barlop

Während das Obige für diese spezielle Situation funktioniert, besagt der Titel über das Testen speziell für ein Verzeichnis. Phoggs Kommentar verwendet if exist mydirname\eher als if exist mydirnameden Weg. Einige Antworten haben \ nul verwendet, aber \ nul ist unter NT problematisch. Ohne einen abschließenden Backslash wird nach einer Datei oder einem Verzeichnis gesucht. Fügen Sie für ein Verzeichnis den nachgestellten Backslash ein.

Sathyajith Bhat
quelle
23
Dies ist korrekt, um die Existenz von Dateien zu testen, aber woher wissen Sie, dass es sich um ein Verzeichnis handelt? Die einfachste Antwort ist if exist mydirname\ und der Rest, wie Sie sagen. Alternativ können Sie auch eine testBinärdatei abrufen und diese unter Windows verwenden.
Phogg
@phogg: Im Zusammenhang mit dieser speziellen Frage: Wenn es existiert, aber eine Datei ist, können Sie es immer noch nicht mkdir.
Grawity
@grawity: Wenn es existiert, aber eine Datei ist, schlägt das Skript wahrscheinlich später fehl, wenn Sie versuchen, es als Verzeichnis zu verwenden. Dies ist wahrscheinlich nicht das, was Sie wollen.
Phogg
Wie kann ich überprüfen, ob nicht vorhanden?
Sungguk Lim
1
@sunglim durch Schreiben von `Wenn myDirName \` nicht in ähnlicher Weise if not 1==1 echo hmm existiert oder wenn myDirName \ ELSE existiert blahblahblah
barlop
20

Folgendes habe ich gerade herausgefunden:

Sie können testen, ob eine NUL-Datei vorhanden ist. Wenn das Verzeichnis existiert, enthält es eine nul-Datei. Wenn die nul-Datei nicht existiert, existiert das Verzeichnis nicht.

IF exist myDirName/nul ( echo myDirName exists ) ELSE ( mkdir myDirName && echo myDirName created)
dev008
quelle
2
+1 - Dies funktioniert in allen Windows- und MS-DOS-Versionen, im Gegensatz zu normalen Versionen, if exist dirnamedie für Windows NT spezifisch zu sein scheinen.
Grawity
das war ein dummer code im vergleich zu linux mkdir -p myDirName: p
Kit Ho
6
Es sollte ein Backslash sein, kein Schrägstrich.
Nathan Garabedian
@grawity Was haltet ihr davon, anscheinend gibt es ein Problem damit, \ nul zu machen? dostips.com/forum/viewtopic.php?f=3&t=4913
barlop
@barlop: Ich denke, dass cmd.exe eine der schlechtesten existierenden Skriptsprachen ist und dass man PowerShell oder andere Alternativen verwenden sollte, wenn dies überhaupt möglich ist. In \nulWindows NT ist dies nicht mehr erforderlich. if exist "C:\Program Files (x86)"Nur sollte es funktionieren (es sei denn, Sie haben noch Windows 98 im Visier ...)
grawity
11

Verwenden Sie einen Backslash, keinen Forward-Slash: myDirName\nulnichtmyDirName/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

Bearbeiten: Dies funktioniert nur, wenn der Verzeichnisname keine Leerzeichen enthält

DVF
quelle
5

Einige haben vorgeschlagen, dies zu tun, aber dies scheint unter NT nicht zuverlässig zu funktionieren

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

Zu der Frage

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>
barlop
quelle
4

Ich fragte mich, warum Joe eine Ablehnung hatte, als ich unter Windows 7 das gleiche Problem hatte, nämlich das

WENN EXISTIEREN Dateiname \ NUL

gab TRUE sowohl für Dateien als auch für Verzeichnisse zurück. Ich habe unter www.robvanderwoude.com/battech_ifexistfolder.php eine alternative Lösung gefunden und mir eine überarbeitete Version der FOR-Schleife von DVF ausgedacht :

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 ) ) )
Damian
quelle
Das war die einzige Lösung, die funktioniert hat, danke. Ich habe eine "2> NUL" hinzugefügt, um die Fehlermeldung zu vermeiden, und die Echowerte in 1 (Verzeichnis existiert), 0 (Verzeichnis existiert nicht), -1 (eine Datei mit demselben Namen existiert) geändert. FOR% A IN (" C: \ temp \ foo \ HELLO WORLD5 ") DO @ (PUSHD"% A "2> NUL && (POPD & ECHO 1) || (WENN EXISTIEREN% A (ECHO -1) ELSE (ECHO 0
Christoph
(Entschuldigung, ich habe es nicht geschafft, den Code als Code in der Antwort zu formatieren, obwohl ich so viele Dinge ausprobiert habe :-( bis die Bearbeitung des Kommentars nach 5 Minuten abgelaufen ist :-()
Christoph
1

Ich sehe viele Probleme mit der Unterscheidung zwischen Dateien und Ordnern. Hat jemand versucht, einfach eine CD einzuspielen, nachdem er überprüft hat, ob sie existiert? Dann wird CD entweder erfolgreich sein oder scheitern.

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
)
Richard Rombouts
quelle
(1) Wenn Sie eine Variable verwenden möchten, verwenden Sie die Variable. Alle Vorkommen MyDirnach der ersten Zeile sollten sein %MyDir%. (2) Sie cd ..werden nicht tun, was Sie wollen, wenn %MyDir%es sich um einen mehrstufigen Pfadnamen (z. B. Pictures\cats) oder sogar einen absoluten Pfadnamen (z \Windows. B. ) handelt. Erwägen Sie die Verwendung von pushd/ popdund / oder setlocal.
Scott
0
exist myDirName/nul

Dies gilt auch dann, wenn myDirName eine Datei ist, bei der es sich nicht um die gesuchte Funktionalität handelt

Joe
quelle
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>Ich bin kein Fan von \ nUl in NT, aber es ist nicht. Du hättest etwas ausgeben sollen.
Barlop
-1

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

für ($ cnt = $ # ARGV; $ cnt> = 0; - $ cnt)
{
   if (-d "$ ARGV [$ cnt]") { 
      print "argv [$ cnt] = $ ARGV [$ cnt] ist ein Ordner \ n";
      $ dir = $ ARGV [$ cnt];
      brechen;
   } else {
      print "argv [$ cnt] = $ ARGV [$ cnt] ist kein Ordner \ n";
   }
}
user937229
quelle
Ich verstehe es nicht
Pierre.Vriens