2017-10-11 190 views
0


我想從我的硬盤遞歸得到所有的文件和我使用enumeratefiles從system.io.directory如下PowerShell的測試:隱藏文件和系統文件

[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 
} 

但是這工作正常,許多行包含隱藏或系統文件。
我已經使用ennumeratefiles作爲j:驅動器非常大,並且此功能的運行速度快於等效的powershell cmdlet。

我該如何測試這些文件類型?

有關於如何exlude從enumeratefiles對於C這些文件類型的東西+ +,但也不是爲PowerShell和我不知道如何更改PowerShell中的代碼:
c++ file hidden or system

回答

0

使用System.IO.FileInfo和一點點-bor荷蘭國際集團枚舉魔術會讓你想要你想要的。

下面的示例將打印包含屬性HiddenSystem的任何項目的完整路徑。

$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: $_" 
    } 
} 

被警告說,如果你遇到一個文件或文件夾,您沒有權限訪問終止錯誤將被拋出停止執行,您可以解決此通過恢復到內置的cmdlet,因爲他們將會拋出無法終止的錯誤並繼續。

$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

感謝您的建議。

看起來,當您獲取「隱藏」文件的文件屬性有時powershell拋出一個非終止錯誤。

[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... 
    # 
} 

我使用建議固定問題