2017-10-11 21 views
0


Je veux obtenir tous les fichiers récursive de mon disque et j'utilise les enumeratefiles de system.io.directory comme suit:test PowerShell pour les fichiers cachés et système

[System.IO.Directory]::EnumerateFiles("J:\","*","AllDirectories")|out-file -Encoding ascii $outputfile 
foreach($line in select-string -Path $outputfile) { 
    # Some of the $line is the name of a hidden or system file 
} 

Cela fonctionne très bien, mais De nombreuses lignes contiennent des fichiers cachés ou système.
J'ai utilisé des fichiers ennumerate car le lecteur j: est très volumineux et cette fonction fonctionne rapidement et bien mieux que les applets de commande PowerShell équivalentes.

Comment puis-je tester ces types de fichiers?

Il y a quelque chose sur la façon à exclure Effectuer ces types de fichiers de enumeratefiles pour C++ mais ni pour Powershell et je ne sais pas comment changer le code de Powershell:
c++ file hidden or system

Répondre

0

En utilisant System.IO.FileInfo et un peu -bor ing ENUM la magie vous donnera envie que vous voulez. Voici un exemple qui affichera le chemin complet de tout élément contenant les attributs Hidden ou System.

$hidden_or_system = [System.IO.FileAttributes]::Hidden -bor [System.IO.FileAttributes]::System 

[System.IO.Directory]::EnumerateFiles("J:\","*","AllDirectories") | ForEach-Object { 
    if ([System.IO.FileInfo]::new($_).Attributes -band $hidden_or_system) { 
     "A hidden or system item: $_" 
    } 
} 

averti que si vous avez un fichier ou un dossier que vous ne disposez pas des autorisations pour accéder à une erreur de terminaison sera jeté arrêter l'exécution, vous pouvez contourner ce problème en revenant aux cmdlets intégrés comme ils lancera des erreurs sans fin et continuera.

$hidden_or_system = [System.IO.FileAttributes]::Hidden -bor [System.IO.FileAttributes]::System 

Get-ChildItem -Path 'J:' -Recurse -Force | ForEach-Object { 
    if ($_.Attributes -band $hidden_or_system) { 
     "A hidden or system item: $($_.FullName)" 
    } 
} 
0

Merci pour la suggestion.

Il semble que lorsque vous obtenez les attributs de fichier pour un fichier "caché", powershell lève parfois une erreur sans fin.

Je résolu le problème en utilisant la suggestion:

[System.IO.Directory]::EnumerateFiles("J:\","*","AllDirectories")|out-file -Encoding ascii $outputfile 
foreach($line in select-string -Path $outputfile) { 
    # Some of the $line is the name of a hidden or system file 
    if ((Get-ItemProperty $line -ErrorAction SilentlyContinue).attributes -band [io.fileattributes]::Hidden) {continue} 
    if (-not $?) {continue} 
    # Is the file a system file? 
    if ((Get-ItemProperty $line -ErrorAction SilentlyContinue).attributes -band [io.fileattributes]::System) {continue} 
    if (-not $?) {continue} 
    # 
    # Do the work here... 
    # 
}