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

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

Printed on: April 25, 2024 at 21:04 o'clock

Member: TK1987
Solution TK1987 May 21, 2021 at 06:16:37 (UTC)
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
Mitglied: 138959
138959 May 21, 2021 at 06:18:24 (UTC)
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
Member: joehuaba
joehuaba May 21, 2021 updated at 06:24:38 (UTC)
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/
Member: Hacktrist
Hacktrist May 21, 2021 at 06:26:11 (UTC)
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
Member: SeaStorm
Solution SeaStorm May 21, 2021 at 06:35:01 (UTC)
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
Member: TK1987
Solution TK1987 May 21, 2021 updated at 06:58:23 (UTC)
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
Member: Hacktrist
Hacktrist May 21, 2021 updated at 07:03:47 (UTC)
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}
Member: TK1987
Solution TK1987 May 21, 2021 updated at 07:07:05 (UTC)
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}
Member: Hacktrist
Hacktrist May 21, 2021 at 07:07:57 (UTC)
Goto Top
Hab deine Änderung schon gelesen. Danke Thomas und SeaStorm