2012-04-19 7 views
3

をpowershellコマンドcopy-itemとして使用して、1つのディスクの内容を別のディスクにコピーしようとしました。Powershell: '完全修飾ファイル名は260文字未満でなければなりません。'

copy-item -Path h:\* -Destination g:\ -Recurse -Force 

はしかし、私は次のエラーを発生しました:

コピーアイテム:指定したパス、ファイル名、またはその両方が長すぎます。 完全修飾ファイル名は260文字未満で、 ディレクトリ名は248文字未満でなければなりません。

これらのエラーは、長いパスのファイルやフォルダを手動で検索してコピーするのを防ぐのに十分です。この問題を避ける最善の方法は何ですか?

答えて

6

私が知る限り、robocopyはこれを自動的に処理します(少なくとも、長いパスの場合は明示的にサポートを無効にする必要があります)。したがって、純粋なPowerShellソリューションではなくネイティブコマンドにあまり悪影響を与えない場合は、

robocopy h:\ g:\ /E 

を使用することができます。

通常、最大32k文字のパスを処理できるようにするには、パスに\\?\を追加することができますが、これは.NETで役に立たない可能性があります。

+0

BCLチームは、「\\?\」オプションについて説明する長いファイルパスのサポートシリーズを用意していました。[ロングパスin .NET、パート1/3](http://blogs.msdn .com/b/bclteam/archive/2007/02/13/long-paths-in-net-part-1-of-3-kim-hamilton.aspx) –

5

On Codeplexマイクロソフトはexperimental long path wrapperをホストしています。これは、System.IO名前空間の現在の259文字の制限よりも長いパスでの作業を容易にする機能を提供します。

PowerShellでこのラッパーを使用してファイルをコピーする方法の例:

[reflection.assembly]::loadfile("C:\Users\stackoverflow\Desktop\Microsoft.Experimental.IO.dll") 
[microsoft.experimental.io.longpathfile]::Copy((gi .\myversion.txt).fullname, "C:\users\stackoverflow\desktop\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",$true) 

その他のサンプルはhereを見つけることができます。