Ordner mit Stapel erstellen, aber nur, wenn er noch nicht vorhanden ist

440

Kann mir jemand sagen, wie man in einem Windows-Batch-Skript Folgendes macht? ( *.bat):

  • Erstellen Sie einen Ordner nur, wenn er noch nicht vorhanden ist

Im Einzelnen möchte ich einen Ordner mit dem Namen VTSauf dem C:\Laufwerk erstellen , aber nur, wenn dieser Ordner noch nicht vorhanden ist. Ich möchte den Inhalt des Ordners nicht überschreiben, wenn er bereits vorhanden ist und der Stapel ausgeführt wird.

Rechnung
quelle
2
Wie wäre es damit ? if not exist "%Folder%" mkdir "%New-Folder%"
Wissenschaftler_7

Antworten:

622

Sie verwenden nur if not exist "C:\VTS\" mkdir C:\VTSFolgendes : Es wird nur dann ein Verzeichnis erstellt, wenn der Ordner nicht vorhanden ist.

Beachten Sie, dass dieser Existenztest nur dann true zurückgibt, wenn VTS vorhanden ist und ein Verzeichnis ist. Wenn es nicht vorhanden ist oder als Datei vorhanden ist, wird der Befehl mkdir ausgeführt und sollte einen Fehler verursachen. Möglicherweise möchten Sie überprüfen, ob VTS auch als Datei vorhanden ist.

Der Antwortende
quelle
7
Nur dass es falsch ist. Sie müssen nach dem NUL-Gerät suchen, sonst funktioniert es nicht. Siehe meine Antwort drei Jahre früher als diese.
Martin Schapendonk
@MartinSchapendonk Dies funktioniert unter Windows 7 und Windows Server 2012, soweit ich aus Tests ersehen kann, und ich wäre sehr überrascht, wenn es nicht mindestens unter XP und bis Windows 10 funktioniert. Können Sie die Bedingungen angeben, wann das funktioniert nicht
jpmc26
12
@ jpmc26 Beim Testen auf NUL müssen Sie sicherstellen, dass Sie auf ein Verzeichnis testen. Andernfalls wird die Bedingung möglicherweise als wahr ausgewertet, auch wenn es sich um eine reguläre Datei handelt. Das ist der Unterschied.
Martin Schapendonk
3
@MartinSchapendonk Ist das Hinzufügen eines abschließenden Schrägstrichs dafür ausreichend? Das scheint zwischen Dateien und Verzeichnissen richtig zu unterscheiden, aber es gibt eine Schwachstelle darin, dass die Erstellung des Verzeichnisses fehlschlägt, wenn die Datei nicht erkannt wird. Ich vermute, dass dies auch ein Problem beim Testen NUList.
jpmc26
6
@ jpmc26 Sie haben Recht, ein abschließender Schrägstrich erledigt den Job und ist eigentlich vorzuziehen, da er mit Anführungszeichen arbeitet (sodass Sie Leerzeichen im Verzeichnispfad haben können). Um zwischen Dateien und Verzeichnissen zu unterscheiden, funktioniert dies wie folgt : if exist "a" if not exist "a\" (echo "it's a file") else (echo "it's a dir"). In Bezug auf Ihren letzten Satz vermute ich, dass an anderer Stelle etwas mit Ihrer Batch-Datei nicht stimmt.
März 2377
221
if exist C:\VTS\NUL echo "Folder already exists"

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

Siehe auch https://support.microsoft.com/en-us/kb/65994

(Update 7. März 2018; Microsoft-Artikel ist nicht verfügbar, Archiv unter https://web.archive.org/web/20150609092521/https://support.microsoft.com/en-us/kb/65994 )

Martin Schapendonk
quelle
12
Persönlich würde ich dies vorziehen, da% errorlevel% nicht festgelegt wird, wenn dir bereits vorhanden ist (die Antwort von Agent_9191 gibt den Fehlercode 1 zurück)
csauve
1
Es ist auch schön und allgemein und kann auf jede andere Aktion angewendet werden, die Sie bedingt
ausführen
3
@YouHaveaBigEgo NUList mit einem L.
Martin Schapendonk
1
Link funktioniert nicht mehr, aber es gibt eine Kopie im Internetarchiv
fernio
3
Obwohl diese Antwort großartig ist, beantwortet sie nicht die Frage "ein Verzeichnis erstellen" :)
Jean-Francois T.
55

Rufen Sie einfach an, mkdir C:\VTSegal was passiert. Es wird einfach gemeldet, dass das Unterverzeichnis bereits vorhanden ist.

Bearbeiten: Wie andere angemerkt haben, wird dadurch% ERRORLEVEL% festgelegt, wenn der Ordner bereits vorhanden ist. Wenn sich Ihr Batch (oder ein Prozess, der ihn aufruft) nicht um die Fehlerstufe kümmert, funktioniert diese Methode einwandfrei. Da in der Frage nicht erwähnt wurde, dass die Fehlerstufe vermieden werden soll, ist diese Antwort vollkommen gültig. Es erfüllt die Anforderungen zum Erstellen des Ordners, wenn er nicht vorhanden ist, und überschreibt nicht den Inhalt eines vorhandenen Ordners. Ansonsten folge Martin Schapendonks Antwort .

Agent_9191
quelle
20
Dies ist ein schlechtes Verhalten aufgrund einer unerwarteten Fehlermeldung / Warnung.
SeriousM
10
Etwas "vollkommen gültig" zu nennen, wenn es gegen Best Practices verstößt, ist intellektuell unehrlich. Als weiteres Beispiel: Wenn Sie jemand fragt, wie Sie ein bestimmtes Sicherheitsproblem vermeiden können, sollte Ihre Antwort nicht "Computer als Administrator ausführen" lauten, auch wenn in der Frage nicht ausdrücklich angegeben wurde, welche Sicherheitsauswirkungen mindestens erforderlich sind. :-)
Jouni Heikniemi
2
@ JouniHeikniemi s / Best Practices /
Jounis
4
Mit Errorlevel oder Errno ist nichts falsch. Sie sind plattformspezifische Fehlermeldungsparadigmen und arbeiten für den Zweck, für den sie entwickelt wurden. Unabhängig von der Plattform oder dem Messaging-Ansatz würde ich das Muster "Versuchen Sie dies zu tun und wiederherzustellen, wenn es fehlschlägt" nicht empfehlen, wenn Sie den häufigen Fehlerfall leicht vermeiden und somit leserlich dokumentieren können. Daher finde ich die Ansätze im "Wenn nicht vorhanden" -Stil überlegen. Aber ich möchte oder möchte nicht zu tief in eine Debatte über die Bildung von Best Practices eintauchen. Ich hatte nicht die Absicht, jemanden zu beleidigen, sondern wollte nur meine Ablehnung klarstellen.
Jouni Heikniemi
4
Das Problem beim einfachen Ignorieren des Fehlers besteht darin, dass Sie nicht wissen, warum er fehlgeschlagen ist. Es könnte fehlgeschlagen sein, weil das Verzeichnis bereits vorhanden war, weil der Benutzer keine Berechtigungen für dieses Verzeichnis hat, weil der übergeordnete Pfad nicht vorhanden war oder weil der Datenträger ausgefallen ist. "Erstellen, wenn es nicht existiert" sollte in allen Fällen außer dem ersten fehlschlagen. Diese Antwort führt jedoch in allen Fällen zu einem Fehler. Deshalb ist es für ein Batch-Skript ungeeignet. -1
jpmc26
38
mkdir C:\VTS 2> NUL

Erstellen Sie einen Ordner namens VTSund Ausgang A subdirectory or file TEST already existszuNUL .

oder

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

Ändern Sie den Laufwerksbuchstaben C:, der mkdirAusgang Fehler NULund den nächsten Befehl auszuführen.

3years2late
quelle
Gibt es eine Möglichkeit, diese Funktion in PowerShell auszuführen? Es scheint keine NULAusgabedatei zu unterstützen .
Aaron Franke
30
set myDIR=LOG
IF not exist %myDIR% (mkdir %myDIR%)
Robie
quelle
1
Wie andere bereits betont haben und Sie möglicherweise in der am besten bewerteten Antwort gesehen haben, funktioniert dies nicht, wenn Sie eine Datei mit dem Namen haben log. Es ist ein subtiler Unterschied, aber es wird zu schwer zu findenden Fehlern in Ihren Skripten führen.
Abel
20

Auf diese Weise sollten Sie am Ende des Verzeichnisnamens einen Backslash setzen , um zu vermeiden, dass dieser Ort in einer Datei ohne Erweiterung mit demselben Namen wie das von Ihnen angegebene Verzeichnis vorhanden ist. Verwenden Sie niemals "C: \ VTS", da dies eine Datei sein kann Wenn der Name "VTS" in der Partition "C: " gespeichert ist, verwenden Sie "C: \ VTS \" . Überprüfen Sie den Backslash nach dem VTS . Dies ist der richtige Weg.

@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
D3F4ULT
quelle
3
Was an Ihrer Lösung besonders interessant ist, ist, dass Sie eine !errorlevel!verzögerte Erweiterung verwenden. Andernfalls ERRORLEVELwürde die Variable vor der Eingabe der ersten if(dh zur Analysezeit) analysiert. Jetzt wird es zur Ausführungszeit analysiert, damit das Ergebnis von erfasst werden kann mkdir. Sie haben auch Recht, auch wenn Sie auf Existenz testen, sollten Sie dennoch auf Erfolg testen (denken Sie zum Beispiel: Zugriff verweigert Fehler). Sehr gute Lösung im Vergleich zu den anderen, +10 !!!
Abel
17

Sie können verwenden:

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

Sie können den Code auch erweitern, um fehlende erwartete Dateien zu ersetzen.

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

quelle
0

Ich habe dies für mein Skript erstellt, das ich in meiner Arbeit für eyebeam verwende.

: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\"
Winston
quelle