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-Key: 667187

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

Printed on: May 8, 2024 at 14:05 o'clock

Member: SeaStorm
SeaStorm May 31, 2021 at 07:24:11 (UTC)
Goto Top
Hi

nimm Powershell und gönne Batch endlich seine Ruhe im Grab.
Mitglied: 148656
148656 May 31, 2021 at 07:43:41 (UTC)
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
Member: TK1987
TK1987 May 31, 2021, updated at Jun 01, 2021 at 06:14:53 (UTC)
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
Member: Pedant
Pedant May 31, 2021 at 08:04:28 (UTC)
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
Member: Enrixk
Enrixk Jun 01, 2021 at 20:45:29 (UTC)
Goto Top
Vielen Dank fürs Mitdenken.

Ich habe mich für eine Lösung mit Powershell entschieden.
Member: Pedant
Pedant Jun 02, 2021 at 07:47:05 (UTC)
Goto Top
Hallo Enrixk,
... ob ein Verzeichnis leer ist.
... eine Lösung mit Powershell ...
Wie sieht die Abfrage jetzt aus?

Gruß Frank
Member: Enrixk
Enrixk Jun 02, 2021 at 13:33:52 (UTC)
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."}  
Member: Pedant
Pedant Jun 02, 2021 at 14:02:54 (UTC)
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