Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Liste von Verzeichnissen auf Existenz überprüfen, ggf anlegen

Mitglied: sisiphus

sisiphus (Level 1) - Jetzt verbinden

15.11.2008, aktualisiert 23:25 Uhr, 5746 Aufrufe, 4 Kommentare

elegantere Konstruktion gesucht für Wiederholungen von "if exists c:\test mkdir c:\test"

Hi,

ich habe ein Skript, mit dem eine Reihe von Verzeichnissen erstellt werden sollen, wenn sie noch nicht existieren (1). Außerdem möchte ich überprüfen, ob das Erstellen des Verzeichnisses erfolgreich war (2), und schlussendlich, ob -- falls der Ordner schon existiert, das Skript, den Ordner betreten darf (3). Die Verzeichnisse werden in Variablen zuvor festgelegt, und es kann leider sein, dass Leerzeichen enthalten sind.

So sieht mein Ansatz aus:
01.
::Existiert das Verzeichnis? 
02.
set "DirToChk=c:\test" 
03.
if not exists "%DirToChk%" mkdir "%DirToChk%" 
04.
if not errorlevel 0 ( 
05.
  echo '%DirToChk%' Konnte nicht erstellt werden. 
06.
  goto :ErrorExit) 
07.
cd "%DirToChk%" 
08.
if not errorlevel 0 ( 
09.
  echo '%DirToChk%' Konnte nicht betreten werden. Geraet angeschlossen? Ist der Benutzer berechtigt? 
10.
  goto :ErrorExit)
Statt diesen Schnipsel ungefähr 15 mal zu schreiben (sicher es geht, aber schön finde ich das nicht), wollte ich dieses Schnipsel über eins Schleife aufrufen lassen. Inspiriert von einem anderen Beitrag hier, dachte ich an eine for-Schleife.

1.
Wie gehe ich mit dem Inhalt der in-Klammer in (%order1% %ordner2% %ordner2%) um. Mir ist nicht klar, wie ich tokens und delims sicher setze, damit ich die Leerzeichen nicht zusätlziche Tokens erzeugen.

2.
Aber schon mit einem Eintrag habe ich Probleme. Zunächst hielt ich /r (weil es ja um Verzeichnisse geht) für die Lösung:
01.
%ScriptDir%=c:\test 
02.
for /r %%i in (%ScriptDir%) do call :DirChk %%i 
03.
 
04.
:DirChk 
05.
set "DirToChk=%~p1" 
06.
if not exists "%DirToChk%" mkdir "%DirToChk%" 
07.
if not errorlevel 0 ( 
08.
  echo '%DirToChk%' Konnte nicht erstellt werden. 
09.
  goto :ErrorExit) 
10.
cd "%DirToChk%" 
11.
if not errorlevel 0 ( 
12.
  echo '%DirToChk%' Konnte nicht betreten werden. Geraet angeschlossen? Ist der Benutzer berechtigt? 
13.
  goto :ErrorExit)
Probleme kriege ich in Zeile 5. Nach mehreren Versuchen, bin ich aber mit meinem Latein am Ende. Ich erhalte in dieser Zeile nur Fehlermeldungen:
Zeile 3 Zeile 5 liefert Bemerkung
for/f set "DirToChk=%1" "Die Datei "c:\batch" kann nicht gefunden werden. Ok, /f steht ja für File, also sagen wir ihm, wir suchen nach Verzeichnissen
for/r set "DirToChk=%~p1" ""\batch\c:\"" ist syntaktisch an dieser Stelle nicht verarbeitbar. /r ist für Verzichnisse dokumentiert, ~p für kompletten Prad. Aber die Reihenfolge ist eigenartig.
for/d set "DirToChk=%~p1" ""\"" ist syntaktisch an dieser Stelle nicht verarbeitbar.
for set "DirToChk=%1" ""c:\batch"" ist syntaktisch an dieser Stelle nicht verarbeitbar. ok, ohne Anführungszeichen?
for set DirToChk=%1 ""c:\batch"" ist syntaktisch an dieser Stelle nicht verarbeitbar. es bleibt dabei

Mir fällt jetzt nichts mehr ein... Kann mir jemand helfen?
Gruß,
Sisiphus
Mitglied: sisiphus
15.11.2008 um 20:56 Uhr
OK,

ich habe einen Fehler gefunden. Und zwar hat sich in Zeile 6 ein Fehler eingeschlichen. Es sollte natürlich exist statt exists heißen. Leider konnte ich der Dos-Shell nicht entnehmen, in welcher Zeile der Fehler lag. mit for ohne weitere Option klappt zumindest der Aufruf.

Gruß, sisiphus
Bitte warten ..
Mitglied: bastla
15.11.2008 um 23:10 Uhr
Hallo sisiphus!

Es gibt natürlich mehrere Möglichkeiten, die Verzeichnisliste festzulegen:

Wenn es nur wenige Verzeichnisse sind, direkt in der "for"- (ohne "/f" oder "/r") Schleife:
for %%i in (D:\EinVerzeichnis "D:\Ein anderes Verzeichnis" "D:\Das\aller\letzte Verzeichnis") do echo "%%~i"
Das geht natürlich auch, wie schon in Deinem Entwurf dargestellt, über eine Variable:
set "Dirs=D:\EinVerzeichnis "D:\Ein anderes Verzeichnis" "D:\Das\aller\letzte Verzeichnis"" 
for %%i in (%Dirs%) do echo "%%~i"
Ansonsten eignet sich eher eine Auflistung in einer Datei, wobei dies auch der Batch selbst sein kann (entsprechend der seinerzeit in BASIC verwendeten DATA-Zeile):
01.
@echo off & setlocal 
02.
REM DATA D:\EinVerzeichnis 
03.
REM DATA D:\Ein anderes Verzeichnis 
04.
REM DATA D:\Das\aller\letzte Verzeichnis 
05.
for /f "tokens=2*" %%i in ('findstr /b /c:"REM DATA" %0') do echo "%%~j"
Hier werden aus der Batchdatei (%0) alle Zeilen, welche mit "REM DATA" beginnen, herausgesucht und wie folgt zerlegt: Leerzeichen (und TAB) ist das Default-Trennzeichen, sodass "token" Nr 1 das "REM" enthält (was uns aber überhaupt nicht interessiert), "token" Nr 2 dem "DATA" entspricht und als %%i zur Verfügung stünde (brauchen wir zwar auch nicht, ist aber erforderlich zur "Abgrenzung" vom Rest) und alles Weitere in der Zeile (ohne weitere Unterteilung = mitsamt Leerzeichen) als "token" Nr 3 in %%j ankommt.

Wenn es eine externe Parameterdatei auch tut, dann zB
01.
@echo off & setlocal 
02.
for /f "delims=" %%i in (D:\Verzeichnisse.txt) do echo "%%~i"
wobei in diesem Fall in der Datei "D:\Verzeichnisse.txt" nur einfach je Zeile ein Verzeichnispfad (mit oder ohne umgebende Anführungszeichen) steht.
In allen Fällen sorgt die Schreibweise "%%~i" dafür, dass (durch ~) bereits vorhandene Anführungszeichen entfernt werden, aber dann auf jeden Fall (auch, wenn es vorher noch keine Anführungszeichen gab) der "fertige" Pfad von Anführungszeichen umgeben ist, womit Du ein definiertes Ergebnis erhältst.
Beim Überprüfen auf Existenz wäre noch zu beachten, dass ein "if exist" auch Dateien berücksichtigt, daher besser etwas ausführlicher (und wegen der größeren Flexibilität in einem Unterprogramm) checken:
01.
for ... do call :ProcessDir "%%~i" 
02.
goto :eof 
03.
 
04.
:ProcessDir 
05.
if exist "%~1\" goto :OK 
06.
if exist "%~1" (echo Datei "%~1" vorhanden - Verzeichnis kann nicht erstellt werden! & goto :eof) 
07.
md "%~1" || (echo Fehler beim Erstellen von "%~1" & goto :eof) 
08.
:OK 
09.
echo Verzeichnis "%~1" (jetzt) vorhanden 
10.
 
11.
:: weitere Prüfungs-/Verarbeitungsschritte 
12.
 
13.
goto :eof
Noch zur Schreibweise
Anweisung1 || Anweisung2
Diese entspricht
Anweisung1 
if errorlevel 1 Anweisung2
und bedeutet, dass bei einem Errorlevel größer 0 nach der Ausführung von "Anweisung1" die "Anweisung2" ausgeführt wird.

Grüße
bastla

P.S.: Mit der Verwendung der "Tabellen"-Formatierung hast Du Dir aber Mühe gegeben und das sehr schön dargestellt.
Bitte warten ..
Mitglied: sisiphus
15.11.2008 um 23:24 Uhr
Hallo bastla,

ich bin mal wieder begeistert.

Danke auch für den Hinweis, dass "exist" auch Dateien berücksichtigt. Da wäre ich schön auf die Nase gefallen!

Nochmals Tausend Dank!
Gruß, sisiphus
Bitte warten ..
Mitglied: bastla
15.11.2008 um 23:25 Uhr
Hallo sisiphus!

Freut mich, wenn's hilft.

Grüße
bastla
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Überprüfen eines FTP-Verzeichnisses ob Ordner vorhanden ist

Frage von hansbaerBatch & Shell1 Kommentar

Hallo mal wieder, ich möchte gerne mit hilfe einer batch überprüfen, ob auf einem FTP Server ein bestimmtes Verzeichnis ...

Batch & Shell

Vor dem Verzeichniss erstellen überprüfen ob Ordner vorhanden sind

Frage von TommylikBatch & Shell12 Kommentare

Hallo, Ich habe mir folgendes geschrieben: Funktioniert ohne Probleme. Es wird immer das Laufwerk D genutzt. Könnte mir einer ...

Windows 10

Neue Sicherheitsmechanismen der Programme Verzeichnisse unter Win10 (ggf. auch Win8)

gelöst Frage von Klaus303Windows 1015 Kommentare

Ich habe noch bis vor Kurzem Win7 genutzt und setze seit einigen Tagen auf meinem Hauptrechner Win10 ein und ...

Windows Netzwerk

Dfsrdiag mehrere Replikations Verzeichnisse gleichzeitig überprüfen

gelöst Frage von DasIstDochIrgendwieWindows Netzwerk2 Kommentare

Es geht um diesen Befehl: "dfsrdiag backlog /SendingMember:<Server1> /ReceivingMember:<Server2> /RGName:<Replication-Group>/RFName:<Replication-Folder>" Ich möchte mehrere Replikationsordner gleichzeitig überprüfen also hier "RFName:" ...

Neue Wissensbeiträge
Windows 10
Zero-Day-Lücke in Microsoft Edge
Information von kgborn vor 2 TagenWindows 10

In Microsofts Edge-Browser klafft wohl eine nicht geschlossene (0-Day) Sicherheitslücke im Just In Time Compiler (JIT Compiler) für Javascript. ...

Sicherheit
Microsoft und Skype: Sicherheit
Information von kgborn vor 2 TagenSicherheit

Die Tage gab es ja einige Berichte zur Sicherheit des Skype-Updaters. Der Updater von Skype läuft unter dem Konto ...

Datenschutz

Behörden ignorieren Sicherheitsbedenken gegenüber Windows 10

Information von Penny.Cilin vor 3 TagenDatenschutz8 Kommentare

Hallo, passend zum Thema Ablösung LIMUX in München ein interessanter Beitrag dazu: Behörden ignorieren Sicherheitsbedenken gegenüber Windows 10 Anscheinend ...

Sicherheit
Information Security Hub Munich airport
Information von brammer vor 3 TagenSicherheit

Hallo, Neues Center für Cyber Kriminalität am Münchener Flughafen brammer

Heiß diskutierte Inhalte
Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1016 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Humor (lol)
Was könnte man mit einem Server machen? Idee gesucht
Frage von 2SeitenHumor (lol)12 Kommentare

Hey Zusammen Ich habe einen alten HP G2 Rackserver zu Hause rumliegen. 28GB Ram, 1xAMD Prozi mit etwa 2GHz. ...

Server-Hardware
Server für Exchange 2016, Kaufberatung
Frage von MazenauerServer-Hardware10 Kommentare

Guten Tag werte Gemeinde, Vorab: Ich dachte es gab mal einen separaten Bereich für solche Anfragen, habe ich leider ...

Firewall
RB2011 Firewall Rule eine bestimmte Mac oder IP Adresse nicht zu blockieren
Frage von lightmanFirewall10 Kommentare

Hallo liebes Forum mit ihren Spezialisten. Ich habe meine Firewall so konfiguriert das kein Endgerät ohne meine Speziellen Erlaubnis ...