hacktrist
Goto Top

Powershell: Verzeichnisinhalt prüfen

Hallo Liebe Administrator Gemeinde,

ich möchte gern ein Script welches prüft ob in einem Ordner "C:\Test" min. 2 Datein enthalten sind.
Sollte das nicht der Fall sein, soll 10 Sekunden gewartet werden und erneut auf den Inhalt von 2 Datein geprüft werden.
Dies soll min. 3x geschehen, bevor dann das Script abgebrochen wird oder bei Erfolg weiteren Code ausführt.

Ich weiß, dass ich die Zeile mit
if Test-Path (!(C:\Test\
beginne, aber wie sage ich, dass auf 2 Datein geprüft wird und wie sage ich, dass es eine 3 mal zu wiederholende Schleife ist? Ich habe leider noch keine Erfahrungen mit Schleifen in PS.

Gruß
Tristan

Content-ID: 666951

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

Ausgedruckt am: 24.11.2024 um 05:11 Uhr

TK1987
Lösung TK1987 21.05.2021 um 08:16:37 Uhr
Goto Top
Moin Tristan,

Test-Path ist hier das falsche Mittel. Wenn ich dich richtig verstanden habe, willst du ja nicht prüfen ob der Ordner existiert - sondern nur, ob er weniger als 2 Dateien enthält.
Das ginge so:
$Dir = 'C:\Test'  

$Try = 0
while ((Get-ChildItem -File $Dir).Count -lt 2 -and $Try -lt 3) {
  $Try++
  write-host "Versuch ${Try}: Ordner enthält weniger als 2 Dateien. "  
  sleep 10
  }

Gruß Thomas
138959
138959 21.05.2021 um 08:18:24 Uhr
Goto Top
Guten Morgen Tristan,

um das ganze 3 mal zu prüfen würde ich ne For-Schleife nehmen.

for ($i = 0; $i -lt 3; $i++) {
 If (!(Test-Path "$env:SystemDrive\Test\Datei1.txt") -or !(Test-Path "$env:SystemDrive\Test\Datei2.txt")) {  
   Write-Host "Mindestens eine der Dateien existiert nicht"  
 }
}

$env:SystemDrive löst auf C: auf sofern dein System laufwerk auf C: ist
joehuaba
joehuaba 21.05.2021 aktualisiert um 08:24:38 Uhr
Goto Top
Guten Morgen face-smile

ich würde das anders beginnen...

Zuerst baust du eine Schleife, die 3x läuft:
For ($i = 1; $i -eq 3; $i++) { 
		....
} 
Hier den PowerShell Operator -eq verwenden.

Dann würde ich den Inhalt des Ordners auslesen und direkt die Anzahl mit .Count zählen lassen:
$myFiles = (Get-ChildItem -File -Path "C:\Test" | measure-object).Count  

Zum Schluss musst du Prüfen, ob es mehr als 2 Dateien sind:
if($myFiles -ge 2){
    ....deincode...
}

Komplett sollte das dann (ungetestet) so aussehen:
# schleife 3x laufen lassen
For ($i = 1; $i -eq 3; $i++) { 
		
    # dateien zaehlen
    $myFiles = (Get-ChildItem -File -Path "C:\Test" | measure-object).Count  

    # wenn dateien-anzahl groesser oder gleich 2, dann...
    if($myFiles -ge 2){
    ....deincode...
    }

} 

Gruß joehuaba


EDIT:
Achja, du wolltest noch 10 Sekunden warten. Eine Pause bekommst du noch selbst hin:
https://www.itnator.net/eine-pause-in-powershell-script-verwenden/
Hacktrist
Hacktrist 21.05.2021 um 08:26:11 Uhr
Goto Top
Vielen Dank an euch alle Drei.

Da hab ich erst mal ne Menge zu Verstehen face-smile

Am besten gefällt mir Thomas Lösung, aber ich werde mir die anderen 2 auch zu Gemüte führen um das Konstrukt besser zu Verstehen.

Danke
Tristan
SeaStorm
Lösung SeaStorm 21.05.2021 um 08:35:01 Uhr
Goto Top
while ((Get-ChildItem -File $Dir).Count -lt 2 -and $Try -lt 3) {

hier aufpassen, weil der code erst mal nur prüft ob die dateien NICHt da sind. Sind sie da, geht er aus der schleife und behauptet somit erst mal das die Dateien da sind. Er springt aber auch aus der Schleife, wenn die $Try grösser 2 ist und behauptet damit auch das die Bedingung wahr wäre. Ist ja aber nicht so. Die Dateien sind NICHT da. Es wurde nur zu oft versucht
TK1987
Lösung TK1987 21.05.2021 aktualisiert um 08:58:23 Uhr
Goto Top
Zitat von @SeaStorm:
Er springt aber auch aus der Schleife, wenn die $Try grösser 2 ist und behauptet damit auch das die Bedingung wahr wäre. Ist ja aber nicht so. Die Dateien sind NICHT da. Es wurde nur zu oft versucht
Jo, aber es bleibt ja auch noch die Frage: Soll dass Skript etwas tun, wenn nach 3 Versuchen immer noch weniger als 2 Dateien da sind - oder soll es etwas tun soll, sobald min 2 Dateien da sind.

Ohne diese Frage beantwortet zu wissen, kann man auch noch nicht sagen, wann und wo der Return erfolgen soll.

Ups, hatte
bevor dann das Script abgebrochen wird oder bei Erfolg weiteren Code ausführt.
glatt überlesen. Dann einfach unter der while Schleife noch ergänzen:
if ((Get-Childitem -File $Dir).Count -lt 2) {Return}

Gruß Thomas
Hacktrist
Hacktrist 21.05.2021 aktualisiert um 09:03:47 Uhr
Goto Top
O.k.

also so:

$Dir = '\\sidk-vsaode2\Raw2Flat out\14\0687\'  
$Try = 0
while ((Get-ChildItem -File $Dir).Count -lt 2 -and $Try -lt 3) {
  $Try++
  write-host "Versuch ${Try}: Ordner enthält weniger als 2 Dateien. Nächste Prüfung in 10 Sekunden "  
  sleep 10
  }
if ((Get-Childitem -File $Dir).Count -lt 2) {Return}
TK1987
Lösung TK1987 21.05.2021 aktualisiert um 09:07:05 Uhr
Goto Top
Zitat von @Hacktrist:

O.k.

also so:

> $Dir = '\\sidk-vsaode2\Raw2Flat out\14\0687\'  
> $Try = 0
> while ((Get-ChildItem -File $Dir).Count -lt 2 -and $Try -lt 3) {
>   $Try++
>   write-host "Versuch ${Try}: Ordner enthält weniger als 2 Dateien. Nächste Prüfung in 10 Sekunden "  
>   sleep 10
>   }
> if ($try -gt 2) {Return}
Die Stelle ist richtig, habe das If-Statement aber nochmal angepasst. $try könnte ja auch größer 2 sein, wenn nach dem 3. Versuch min. 2 Dateien da sind. Daher so:
if ((Get-Childitem -File $Dir).Count -lt 2) {Return}
Hacktrist
Hacktrist 21.05.2021 um 09:07:57 Uhr
Goto Top
Hab deine Änderung schon gelesen. Danke Thomas und SeaStorm