enrixk
Goto Top

Batch-Grundlagen

Hallo

ich möchte mit einer CMD-Datei prüfen, ob ein Verzeichnis leer ist.

Nun habe ich hier in den Tiefen des Forums die folgende Befehlskette aufgeschnappt:

@echo off
Set "extensionsdir=C:\Users\Benutzername\Desktop\vscode\extensions"  

( if exist %extensionsdir% dir /b /a:d %extensionsdir%>nul 2>nul) || @echo %extensionsdir% ist leer
( if exist %extensionsdir% dir /b /a:d %extensionsdir%>nul 2>nul) && @echo %extensionsdir% ist nicht leer

Die allgemeine Syntaxregel lautet für die IF-Anweisung wie folgt:

if [not] exist <filename> <command> [else <expression>]

  • Ich möchte gern wissen, ob die Anweisung dir /b /a:d %extensionsdir% in diesem Fall <command> ist oder ob die Anweisung zur IF-EXIST-Bedingung dazugehört.

  • Ein weiterer Punkt ist mir aufgefallen: Seltsamerweise wird die Ausgabe "C:\Users\Benutzername\Desktop\vscode\extensions ist nicht leer" auch dann noch ausgegeben, wenn ich das zu Testzwecken in dem Verzeichnis %extensionsdir% erstellte Test-Verzeichnis wieder lösche. Woran kann das liegen?

Content-ID: 667187

Url: https://administrator.de/contentid/667187

Ausgedruckt am: 23.11.2024 um 15:11 Uhr

SeaStorm
SeaStorm 31.05.2021 um 09:24:11 Uhr
Goto Top
Hi

nimm Powershell und gönne Batch endlich seine Ruhe im Grab.
148656
148656 31.05.2021 um 09:43:41 Uhr
Goto Top
Zitat von @SeaStorm:

Hi

nimm Powershell und gönne Batch endlich seine Ruhe im Grab.

Ich unterstreiche die Antwort mit folgendem Lösungsvorschlag face-smile
update-help 
get-help test-path -examples
TK1987
TK1987 31.05.2021, aktualisiert am 01.06.2021 um 08:14:53 Uhr
Goto Top
Moin,

Zitat von @Enrixk:
Nun habe ich hier in den Tiefen des Forums die folgende Befehlskette aufgeschnappt:
> @echo off
> Set "extensionsdir=C:\Users\Benutzername\Desktop\vscode\extensions"  
> 
> ( if exist %extensionsdir% dir /b /a:d %extensionsdir%>nul 2>nul) || @echo %extensionsdir% ist leer
> ( if exist %extensionsdir% dir /b /a:d %extensionsdir%>nul 2>nul) && @echo %extensionsdir% ist nicht leer
> 
keine Ahnung wo du das her hast, aber das kann so nicht funktionieren, weil dir /ad auch dann erfolgreich ausgeführt wird, wenn es keine Unterverzeichnisse gibt.
Darüber hinaus ist es ziemlich ineffizient, 2x hintereinander das selbe If-Statement zu überprüfen.

Die allgemeine Syntaxregel lautet für die IF-Anweisung wie folgt:
  • Ich möchte gern wissen, ob die Anweisung dir /b /a:d %extensionsdir% in diesem Fall <command> ist oder ob die Anweisung zur IF-EXIST-Bedingung dazugehört.
Natürlich ist das der Befehl.

* Ein weiterer Punkt ist mir aufgefallen: Seltsamerweise wird die Ausgabe "C:\Users\Benutzername\Desktop\vscode\extensions ist nicht leer" auch dann noch ausgegeben, wenn ich das zu Testzwecken in dem Verzeichnis %extensionsdir% erstellte Test-Verzeichnis wieder lösche. Woran kann das liegen?
Siehe oben.

Lass das mit dem Batch besser bleiben und greife zeitgemäß gleich zu Powershell
$Extensiondir = 'C:\Users\Benutzername\Desktop\vscode\extensions'  

if ( Get-ChildItem $Extensiondir -ErrorAction SilentlyContinue ) { write-host "Ordner ""$Extensiondir"" ist nicht leer. " }  
else { write-host "Ordner ""$Extensiondir"" ist leer. " }  

Gruß Thomas
Pedant
Pedant 31.05.2021 um 10:04:28 Uhr
Goto Top
Hallo Enrixk,

Deine Codebeispiel kann ich nicht wirklich nachvollziehen.
Ich kann Dir aber eine Alternative vorschlagen.
@echo off

set extensionsdir=C:\Users\Benutzername\Desktop\vscode\extensions
set inhalt=

for /f %%i in ('dir %extensionsdir%\*.* /b') do set inhalt=%%i
if "%inhalt%"=="" goto ende

echo Hallo Welt
echo hier passieren tolle Sachen

goto ende

:ende
set extensionsdir=
set inhalt=

ich möchte mit einer CMD-Datei prüfen, ob ein Verzeichnis leer ist.
Der von mir verwendetet Befehl
dir %extensionsdir%\*.* /b
produziert keine Ausgabe wenn weder Dateien noch Unterverzeichnisse gefunden werden.
Objekte die das Attribut "versteckt" oder "system" haben, werden vom Befehl übersehen.
Falls das stören sollte, kann man da nachbessern.

Gruß Frank
Enrixk
Enrixk 01.06.2021 um 22:45:29 Uhr
Goto Top
Vielen Dank fürs Mitdenken.

Ich habe mich für eine Lösung mit Powershell entschieden.
Pedant
Pedant 02.06.2021 um 09:47:05 Uhr
Goto Top
Hallo Enrixk,
... ob ein Verzeichnis leer ist.
... eine Lösung mit Powershell ...
Wie sieht die Abfrage jetzt aus?

Gruß Frank
Enrixk
Enrixk 02.06.2021 um 15:33:52 Uhr
Goto Top
Hallo @Pedant

Die Lösung sieht wie folgt aus:
$ExtDir="C:\Users\Benutzer\Desktop\vscode\extensions"  
$extDirList=Get-ChildItem -Path $ExtDir
if($extDirList.count -eq 0){
    Write-Output "Das Verzeichnis ist leer"  
}
else{Write-Output "Das Verzeichnis ist nicht leer."}  
Pedant
Pedant 02.06.2021 um 16:02:54 Uhr
Goto Top
Hallo Enrixk,

danke fürs (mit)teilen.

Eine kleine Anmerkung für alle, die per Suche über den Code stolpern:
Es werden sowohl Dateien, als auch Unterordner gezählt.
Falls alle Elemente im zu prüfenden Verzeichnis das Attribut "versteckt" haben oder in einem Unterordner liegen der seinerseits "versteckt" ist, wird das zu prüfenden Verzeichnis als leer gewertet.

Gruß Frank