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。Docs hokeypokey \ imp \ lalalid \ welpy qwerty-poloky Architecture-tada sausy(from Internet)todady poloky TPG upodsl poliduity \ B4PE to Y3-E xternal asdfds polm toluky to Saftgy 3 yuppy App \ OldDocs'。

パスを少しわかりにくくしましたが、レイアウトはそこにあります。

Get-ChildItemの代わりにGetFilesを使用しようとしている理由は、速度によるものです。ネットワーク上で数百テラバイトを超える可能性がありますが、.Netオブジェクトを取得するときにGet-ChildItemが遅すぎて、必要以上の情報が含まれています。

私が尋ねている質問は、「> -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 に答える