seastorm
Goto Top

Powershell Get-ChildItem Errorhandling ohne Stop

Hallo zusammen

ich bastle mir zZ ein kleines Script bei dem ich rekursiv durch alle Ordner eines Shares loope.
Jetzt habe ich das Problem, das hier Ordnerlängen > 255 Zeichen existieren.
Mache ich ein GCI, sagt dieses, das ein Ordner mit > 255 Zeichen nicht existieren würde.
Kein Problem, ignoriere ich diesen Ordner halt.
Dazu würde ich gerne einfach den Ordner Loggen und im Script weiter machen.

Jetzt das Problem:

Mein Script wäre
Get-ChildItem -path $path -Recurse -Directory -Force -ErrorAction Stop -Verbose -ErrorVariable err | 
ForEach-Object {
          #Tu Dinge
            
        }
}catch [System.IO.DirectoryNotFoundException]{
    Write-Host "Fehler..." -Foregroundcolor Red  
}
Hier catched er zwar korrekt den Fehler, Stoppt danach aber das Script.
Ich würde aber gerne den fehler catchen, loggen und danach weiter machen.
Mit Continue erhalte ich zwar eine Exception Meldung, aber diese landet nicht im Catch ...

Hat jemand eine Idee ?

Gruß Sea


(und: Es gab hier doch mal eine Powershell Sektion? Warum finde ich die nicht in der Auswahl?)

Content-Key: 500105

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

Ausgedruckt am: 28.03.2024 um 17:03 Uhr

Mitglied: 141320
141320 01.10.2019 aktualisiert um 11:11:59 Uhr
Goto Top
Kein Problem, ignoriere ich diesen Ordner halt.
Muss man nicht, einfach die entsprechende Syntax verwenden und schon gehen auch Pfade > 255 face-smile
gci "\\?\D:\longpath" -Recurse -Directory -Force  
Mitglied: SeaStorm
SeaStorm 01.10.2019 aktualisiert um 11:20:51 Uhr
Goto Top
geht leider nicht, weil das share eine EMC mit eigenen Shares ist und keine Windows Büchse.
Aber unabhängig davon interessiert mich die Stop-Problematik selbst und wie ich das in PS lösen kann
Mitglied: 141320
141320 01.10.2019 aktualisiert um 11:20:43 Uhr
Goto Top
Aber unabhängig davon interessiert mich die Problematik selbst und wie ich das in PS lösen kann
So
gci "D:\longpath" -Recurse -Dir -ErrorVariable err -EA Continue | %{  
   # do something
}

if ($err){
    write-host "Ordner mit Fehlern:" -F Yellow  
    $err.TargetObject
}
Mitglied: SeaStorm
SeaStorm 01.10.2019 aktualisiert um 11:26:20 Uhr
Goto Top
Leider auch nicht face-smile

Das würde generell alle Fehler betreffen. Wenn ich aber z.B kein Zugriff wegen fehlender Berechtigung habe, dann schlägt das da auch auf.
Und in dem Script geht es explizit darum diese fehlenden Berechtigungen zu finden und zu korrigieren.

ich muss also wissen ob es ein DirectoryNotFound oder PermissionDenied ist
Mitglied: 141320
Lösung 141320 01.10.2019 aktualisiert um 11:33:49 Uhr
Goto Top
Zitat von @SeaStorm:

Leider auch nicht face-smile
Doch.
Das würde generell alle Fehler betreffen. Wenn ich aber z.B kein Zugriff wegen fehlender Berechtigung habe, dann schlägt das da auch auf.
Und in dem Script geht es explizit darum diese fehlenden Berechtigungen zu finden und zu korrigieren.

ich muss also wissen ob es ein DirectoryNotFound oder PermissionDenied ist
Das ist doch einfach $err enthält alle nötigen Properties.
Durchlaufe $err einfach mit einer Foreach-Schleife und prüfe die CategoryInfo.Reason face-smile
$err | gm *
$err | ?{$_.CategoryInfo.Reason -eq 'UnauthorizedAccessException'} | select -Expand TargetObject  
Mitglied: SeaStorm
SeaStorm 01.10.2019 um 11:32:31 Uhr
Goto Top
Woah... da hatte ich ja mal Tomaten auf den Augen. Ich hab irgendwie die ganze Zeit gedacht das ist ein String Array 🤦‍♂️

Vielen Dank!
Mitglied: emeriks
emeriks 01.10.2019 aktualisiert um 11:33:46 Uhr
Goto Top
Zitat von @141320:
Das ist doch einfach $err enthält alle nötigen Properties.
Durchlaufe $err einfach mit einer Foreach-Schleife und prüfe die CategoryInfo.Reason face-smile
$err | gm *
Ja, aber dann vor dem Get-ChildiItem nicht das $err.clear vergessen! face-wink
Mitglied: 141320
141320 01.10.2019 aktualisiert um 11:38:31 Uhr
Goto Top
Zitat von @emeriks:

Zitat von @141320:
Das ist doch einfach $err enthält alle nötigen Properties.
Durchlaufe $err einfach mit einer Foreach-Schleife und prüfe die CategoryInfo.Reason face-smile
$err | gm *
Ja, aber dann vor dem Get-ChildiItem nicht das $err.clear() vergessen! face-wink
Nicht nötig ich nutzte hier ja nicht die besondere PS Variable $Error. Bei diesem Beispiel wird die $err Variable ja jedes mal neu erstellt.
Mitglied: NetzwerkDude
NetzwerkDude 01.10.2019 aktualisiert um 11:46:00 Uhr
Goto Top
Ich hatte vor einer Weile einen Tipp mit dem man auch längere Pfade mit PS ansprechen kann:
Mit Pfaden über 260 zeichen in powershell arbeiten

Ansonsten evtl. die error action auf continue setzen, und die fehler alle mit
2>
umleiten in eine variable, und später dann auswerten

edit: mit error variable natürlich die viel elegantere antwort - ich sollte aufhören superlangsam auf dem handy zu schreiben face-smile
Mitglied: 141320
141320 01.10.2019 aktualisiert um 11:50:08 Uhr
Goto Top
Oder man aktiviert sich zus. lange Pfade.
How to enable paths longer than 260 characters in Windows 10

Aber ihm gings ja offensichtlich primär um die AccessException Fehler