1
$ErrorActionPreference = 'Continue'

try
{
    $fileEntries = [IO.Directory]::GetFiles("somedirectory", "*",[IO.SearchOption]::AllDirectories); 
}
catch [Exception]
{
    $_.Exception.Message
}
foreach($fileName in $fileEntries) 
{ 
    [Console]::WriteLine($fileName); 
} 

上面的代码抛出异常

找不到路径 '\blah\dah\dodah\updity_and_suppy\03 的一部分。文档 hokeypokey\imp\lalalid\welpy qwerty-poloky 架构 - tada sausy(来自 Internet)todady poloky TPG upodsl poliduity\B4PE 到 Y3 - 外部 asdfds polm toluky 到 Saftgy 3 yuppy App\Old Docs'。

我稍微混淆了路径,但布局在那里。

我尝试使用 GetFiles 而不是 Get-ChildItem 的原因是速度。我正在通过网络遍历可能有 100 TB 的数据,而 Get-ChildItem 在检索 .Net 对象时速度太慢,并且包含的​​信息超出了我的需要。

我要问的问题是“可以使用类似于 > -ErrorAction SilentlyContinue 的方法忽略此错误吗?” 或“有没有办法阻止此错误的发生?”

谢谢您的考虑。

4

1 回答 1

0
$ErrorActionPreference = 'Stop'

function recurse
{

    param($path)

    try
    {
           $fileEntries = [IO.Directory]::GetFiles($path)
           [System.IO.DirectoryInfo]$directInf = New-Object IO.DirectoryInfo($path)
           $folders = $directInf.GetDirectories()
    }
    catch [Exception]
    {
           $_.Exception.Message
           $folders = @()
     }

    foreach($fileName in $fileEntries) 
    {

          #[Console]::WriteLine($fileName); 

    }

    Remove-Variable -ErrorAction SilentlyContinue -Name fileEntries 

    foreach($folder in $folders)
    {
        recurse($path + $folder + "\")
    }
    Remove-Variable -ErrorAction SilentlyContinue -Name folders 
}

recurse #path that you wish to search

这可能不是最好的解决方案,但它会递归地遍历文件夹并获取文件名,比网络上的 get-childitem 快得多,并且处理超过 260 的路径抛出的异常并继续(它不能解决问题,只是忽略并继续)。Remove-Variable 是为了帮助解决内存问题,它是否有帮助是另一回事。

于 2013-02-19T07:08:06.437 回答