web-dev-qa-db-ja.com

Get-ChildItemの使用時のPathTooLongExceptionエラー

属性ArchiveおよびOfflineを使用して、ファイル共有上のすべての既知のファイルのリストを生成しようとしています。

しかし、PathTooLongExceptionエラーが何度も発生します。

これまでのところ、同じ種類の "これらの属性のみ"の種類の結果を取得できないことを除いて、Robocopyがファイル長のエラーを超えて機能することがわかりました。

例:

Get-ChildItem -Attributes A+O -Recurse |Export-Csv E:\temp\StubSearchCorp.csv

与える:

Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be 
less than 248 characters.
At line:1 char:1
+ Get-ChildItem -Attributes A+O -Recurse |Export-Csv E:\temp\StubSearchA.Corp.cs ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   + CategoryInfo          : ReadError: (F:\Corporate\...e A Train & Ship:String) [Get-ChildItem], PathTooLongException
   + FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

このようなリストをCSVにエクスポートする方法を誰かが知っていますか?

4
Marcus

Robocopyは、多くのオプションを備えたスイスアーミーナイフです。他のすべてのツールは、パスが長すぎるというエラーの影響を受けると思います。 Get-ChildItemがCSVで生成するすべてのプロパティが本当に必要ですか、それとも完全修飾ファイル名のリストのみに関心がありますか?後者の場合、これを試してください:

ROBOCOPY source dest /IA:AO /FP /NP /S /L /LOG:myfiles.txt

/ Lは、データをコピーせずにリストを作成します。
/FPには、ファイル名だけでなくフルパスが含まれています。
/NPは、ログ内の進行状況メッセージの割合を抑制します
Robocopyの使用法から「ファイル選択オプション」を参照してください:
/IA:[RASHCNETO] ::指定された属性セットのいずれかを持つファイルのみを含めます

2
Clayton

this SO answer にPowershellベースのソリューションが見つかりました。これは、これらの恐ろしいPathTooLongExceptionロギングを無視する方法を説明しています。具体的な用途は次のとおりです:

Get-ChildItem *.txt -Recurse -ErrorAction SilentlyContinue | Select-String "my pattern"

OPのシナリオでは、これは次のようになります。

Get-ChildItem -Attributes A+O -Recurse -ErrorAction SilentlyContinue | Export-Csv "rslt.csv"

主な欠点の1つ:これは、PowerShellの好み(コマンドが約束するとおり)のために「長すぎる」と見なされるすべてのパスを静かに無視します。ただし、私自身のケースでは、node_modulesフォルダーに関するこれらのエラーを抑制するように言っています。他にも同じ問題で上陸する可能性があるため、ここで共有することにしました...

1
Jeroen