2017-05-11 3 views
2

Ich verwende PowerShell 5.0 und arbeite an einem Skript, um alle Versionen von log4net.dll im aktuellen Verzeichnis rekursiv zu finden und aufzulisten.Wie vermeidet man eine UnathorizedAccessException bei Verwendung von Get-ChildItem?

Get-ChildItem log4net.dll -Recurse | % versioninfo | Export-Csv "C:\MyJunk\log4net.csv" 

Die obige Aussage beginnt als Rückkehr Versionsinformationen erwartet, aber die Ausführung stoppt beim ersten Ordner I Zugriffsberechtigung fehlt:

Get-ChildItem : The specified network name is no longer available. 
At line:1 char:1 
+ Get-ChildItem log4net.dll -Recurse | % versioninfo | Export-Csv "C:\M ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : ReadError: (J:\ArcPlan_OracleWallet\Production:String) [Get-ChildItem], IOException 
+ FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand 

Get-ChildItem : Access is denied 
At line:1 char:1 
+ Get-ChildItem log4net.dll -Recurse | % versioninfo | Export-Csv "C:\M ... 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : NotSpecified: (:) [Get-ChildItem], UnauthorizedAccessException 
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetChildItemCommand 

Ich bin mit Windows Powershell ISE als Adminstrator. ExecutionPolicy ist RemoteSigned und $ ErrorActionPreference ist Continue.

Idealerweise möchte ich, dass das Skript die ACL jedes Ordners abfragt und alle Ordner (und deren Inhalt) umgeht, auf die ich nicht zugreifen darf. Eine andere Lösung wäre eine, bei der hart codierte Ordner umgangen werden. Als Novize in PowerShell habe ich mich auf das Spätere konzentriert.

Ich habe versucht, den ersten Problemordner (namentlich) zu umgehen, um zu sehen, ob ich das zum Laufen bringen konnte, aber die gleiche Ausnahme und Verarbeitung stoppst.

Get-ChildItem log4net.dll -Recurse | Where-Object { $_.FullName -notmatch '\\ArcPlan_OracleWallet\\?'} | export-csv 'C:\MyJunk\log4net.csv' 

Danke.

+2

'Get-ChildItem -Recurse -ErrorAction SilentlyContinue'? –

+0

@Ansgar. Danke für die Wiederholung. Ich bekomme immer noch die Ausnahme Zugriff verweigert. –

+0

'Der angegebene Netzwerkname ist nicht mehr verfügbar 'ist diese Fehlermeldung falsch oder besteht wirklich ein Netzwerkproblem? Vielleicht stoppt deshalb die Skriptausführung? – sodawillow

Antwort

0

Wenn Sie die Fehler ignorieren möchten, verwenden Sie -ErrorAction SilentlyContinue.

Es gibt andere nützliche Werte für diesen Parameter, da Sie here und finden können.

Here is a nice question ziemlich zum Thema.

Sie können auch Hilfe mit Get-Help about_CommonParameters holen.

(Hallo und willkommen, wenn Sie diese Antwort graben, read this ^^).

+0

Ich benutze '-ErrorAction SilentlyContinue' ziemlich oft und habe festgestellt, dass der kürzere Alias' -ea4' einfacher und schneller zu tippen ist. '-ea' ist ein Alias ​​für' -ErrorAction' und '4', weil' SilentlyContinue' das vierte Element in [ActionPreference] ist (https://msdn.microsoft.com/de-de/library/system.management. automation.actionpreference (v = vs.85) .aspx) enum. – TheMadTechnician

+0

Ich denke, richtige kurze Version sollte sein -ea 0 'PS H: \> 0 ..5 | % {Write-Host $ _ ([System.Management.Automation.ActionPreference] $ _)} '' 0 SilentlyContinue' '1 Stop' ' 2 CONTINUE '3 Inquire' ' 4 Ignorieren '5 Suspend' – Igor

+0

Ich habe' if (Test-Verbindung $ host -Quiet-Count 2 -EA 0) {#host ist online, weiter} 'viele Male vor dem Verständnis der'EA-0 "Bit:) – sodawillow

0

Ich glaube, das Problem war, dass die Get-ChildItem log4net.dll -Recurse würde fehlschlagen, bevor die Where-Object könnte die unerwünschten Verzeichnisse herausfiltern.

Ich möchte hard-coding Verzeichnisse vermeiden, aber hier ist meine (klunky) Lösung so weit.

## Version information will be retrieved for $fileName 
$fileName = 'log4net.dll' 

$ErrorActionPreference = 'Continue' 

## Get directies - excluding those you lack permission to access 
$directories = Get-ChildItem -Directory | 
    Where-Object {$_.FullName -inotmatch 'directory-1' -and 
       $_.FullName -inotmatch 'directory-2' -and 
       $_.FullName -inotmatch 'directory-3'      
} 

## Array to hold version information 
$allFilesVersionInfo = @() 

foreach ($directory in $directories) { 

    ## Get all files recursively 
    $files = Get-ChildItem -Path $directory.FullName $fileName -Recurse 

    foreach ($file in $files) { 

     ## Get version information and add to array 
     $fileVersionInfo = $file | % versioninfo 
     $allFilesVersionInfo += $fileVersionInfo 
    } 
} 

# Write version information in arra to file 
$exportFullPath = "C:\MyJunk\$($fileName)-version.csv" 
$allFilesVersionInfo | Export-Csv -Path $($exportFullPath) 
Verwandte Themen