3

Windows Server 2008 R2 VMで、 Get-ChildItem(gci)のパフォーマンスの向上を利用することを期待して、PowerShellをv3にアップグレードしました。この行は、v2ではエラーなしで実行されました。

$search = gci $dir -recurse -exclude "*.mdf" | where {$_.length -gt 100mb}

v3にアップグレードした後、同じ行でこのエラーが発生するのはなぜですか?$dir値は変更されません。

gci:指定されたパス、ファイル名、またはその両方が長すぎます。完全修飾ファイル名は260文字未満である必要があり、ディレクトリ名は248文字未満である必要があります。行:1文字:11 + $ search = gci $ dir -recurse -exclude "* .mdf" | ここで、{$_。length-gt 100mb} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ReadError: (\ server.domain ... DETAILS 1.0.prt:String)[Get-ChildItem]、PathTooLongException + FullyQualifiedErrorId:DirIOError、Microsoft.PowerShell.Commands.GetChildItemCommand

Windows Updateを適用して再起動した後も、変更はありません。PowerShellをアップグレードする前にVMのスナップショットを撮ったので、簡単に切り替えることができます。

$errorActionPreferencev2とContinuev3の両方にあります。

$search.countv2とv3の両方で8なので、不足しているものについてはあまり心配していませんが、動作の変化を理解したいと思います。

v2で追加を試みたところ-force、同様のPathTooLongエラーが発生し、.count10でした。v3で追加-forceした後、 .count9でした。その後、v2に戻り、再び10個のファイルが見つかりました-force。それでも、下のデータを変更すること$dirで違いを説明できる可能性.countはありますが、私たちの環境では、データを変更しても、v3ではPathTooLongエラーが一貫して存在することを現実的に説明できませんでしたが、v2では説明できませんでした。私の好奇心が良くなった今、誰かがこの謎を先導し、エラー処理を免れることを望んでいます。それは、私が認める、より多くの手がかりを提供するかもしれません。

FWIW、TechNetの使用法のドキュメントには、v2とv3の両方に適用されると記載されています。-Forceパラメータのデフォルト値はFalseです。

PowerShellとMAX_PATHv1の時代からの背景。

Windows Server 2008 R2 VMで、 Get-ChildItem(gci)のパフォーマンスの向上を利用することを期待して、PowerShellをv3にアップグレードしました。この行は、v2ではエラーなしで実行されました。

$search = gci $dir -recurse -exclude "*.mdf" | where {$_.length -gt 100mb}

v3にアップグレードした後、同じ行でこのエラーが発生するのはなぜですか?$dir値は変更されません。

gci:指定されたパス、ファイル名、またはその両方が長すぎます。完全修飾ファイル名は260文字未満である必要があり、ディレクトリ名は248文字未満である必要があります。行:1文字:11 + $ search = gci $ dir -recurse -exclude "* .mdf" | ここで、{$_。length-gt 100mb} + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:ReadError: (\ server.domain ... DETAILS 1.0.prt:String)[Get-ChildItem]、PathTooLongException + FullyQualifiedErrorId:DirIOError、Microsoft.PowerShell.Commands.GetChildItemCommand

Windows Updateを適用して再起動した後も、変更はありません。PowerShellをアップグレードする前にVMのスナップショットを撮ったので、簡単に切り替えることができます。

$errorActionPreferencev2とContinuev3の両方にあります。

$search.countv2とv3の両方で8なので、不足しているものについてはあまり心配していませんが、動作の変化を理解したいと思います。

v2で追加を試みたところ-force、同様のPathTooLongエラーが発生し、.count10でした。v3で追加-forceした後、 .count9でした。その後、v2に戻り、再び10個のファイルが見つかりました-force。それでも、下のデータを変更すること$dirで違いを説明できる可能性.countはありますが、私たちの環境では、データを変更しても、v3ではPathTooLongエラーが一貫して存在することを現実的に説明できませんでしたが、v2では説明できませんでした。私の好奇心が良くなった今、誰かがこの謎を先導し、エラー処理を免れることを望んでいます。それは、私が認める、より多くの手がかりを提供するかもしれません。

FWIW、TechNetの使用法のドキュメントには、v2とv3の両方に適用されると記載されています。-Forceパラメータのデフォルト値はFalseです。

PowerShellとMAX_PATHv1の時代からの背景。

4

1 に答える 1

4

PathTooLongExceptionはPowerShellに固有のものではないことを私は知っています。これは、バックグラウンドで呼び出されるWin32APIによってスローされます。長いパスで作業する必要がある場合は、PowerShellで代わりにUnicodeバージョンのWin32APIを使用できるかどうかがわかる場合があります。詳細はこちらをご覧ください

バージョン2がエラーをスローしなかった理由については、バージョン2の方が例外の内部処理が「優れている」と推測できます。

于 2012-11-09T17:53:07.460 に答える