Windowsでパスの長さが260文字を超えるファイルを見つけるにはどうすればよいですか?


87

XP Windowsスクリプトでxcopyを使用して、ディレクトリを再帰的にコピーしています。コピーしようとしているファイルのパスが長すぎるため、「メモリ不足」エラーが発生し続けます。パスの長さを簡単に減らすことはできますが、残念ながら、どのファイルがパスの長さの制限に違反しているかを特定できません。コピーされたファイルは標準出力(ログファイルにリダイレクトしています)に出力されますが、エラーメッセージが端末に出力されるため、エラーが発生しているディレクトリを正確に把握することさえできません。 。


回答:


114

を実行してdir /s /b > out.txtから、位置260にガイドを追加します

PowerShellで cmd /c dir /s /b |? {$_.length -gt 260}


1
dir / s / b> out.txtはその仕事を美しく行います。ありがとう。「「Get-ChildItem」は、内部または外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されません。」私はPowerShellを持っていないと思います。
WestHamster 2012年

1
@ WestHamster、PowerShellコンソールでそのコマンドを実行する必要があります。
ラミA.

6
次のようなエラーが発生します。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.それに伴い、短縮されたパスのみが出力されます。例:D:\Dropbox\ProY...sh._setbinddata。それらはまさに私が見つけたい道ですが、私は道全体を見ることができません!これを回避する方法はありますか?
miniGod 2015年

これを機能させることができないのは私だけですか?Win764ビットHomePremium、Powershell 2.0を使用-長い名前(240文字)でテストファイルを作成し、それが置かれているディレクトリの名前を長い名前に変更Get-ChildItems -r *すると、ファイルが表示されなくなります...のみがdir /s /b機能します私のために。
Jonas Heidelberg

PowerShellでこれを実現する方法については、私の回答を参照してください。問題のあるファイル名(260文字を超えるもの)を見つけるか、無視することができます。
ジョンノ2015年

31

この目的のためにパス長チェッカーツールを作成しまし。これは、特定のディレクトリ内のすべてのファイルとディレクトリのパス長を確認するために使用できる、優れた無料のGUIアプリです。

また、ファイルとディレクトリの長さを取得するための簡単なPowerShellスクリプトについて書いたりブログを書いたりしました。ファイルへの長さとパスを出力し、オプションでコンソールにも書き込みます。特定の長さを超えるファイルの表示に限定されず(簡単に変更できます)、長さの降順で表示されるため、しきい値を超えているパスを簡単に確認できます。ここにあります:

$pathToScan = "C:\Some Folder"  # The path to scan and the the lengths for (sub-directories will be scanned as well).
$outputFilePath = "C:\temp\PathLengths.txt" # This must be a file in a directory that exists and does not require admin rights to write to.
$writeToConsoleAsWell = $true   # Writing to the console will be much slower.

# Open a new file stream (nice and fast) and write all the paths and their lengths to it.
$outputFileDirectory = Split-Path $outputFilePath -Parent
if (!(Test-Path $outputFileDirectory)) { New-Item $outputFileDirectory -ItemType Directory }
$stream = New-Object System.IO.StreamWriter($outputFilePath, $false)
Get-ChildItem -Path $pathToScan -Recurse -Force | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}} | Sort-Object -Property FullNameLength -Descending | ForEach-Object {
    $filePath = $_.FullName
    $length = $_.FullNameLength
    $string = "$length : $filePath"

    # Write to the Console.
    if ($writeToConsoleAsWell) { Write-Host $string }

    #Write to the file.
    $stream.WriteLine($string)
}
$stream.Close()

2
興味深いスクリプトですが、まだこのエラーが発生しています: 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.
zkurtz 2014

優れたツール!! 私は巨大な日付を持っていて、WD MyCloudHDDにバックアップを作成したかった。このツールによって、HDD上にフォルダ構造を作成するための最大長を知るようになりました。ありがとう。
NJMR 2016

27

最も単純なソリューションの改良版として、Powershellをインストールできない、またはインストールしたくない場合は、次のコマンドを実行します。

dir /s /b | sort /r /+261 > out.txt

または(より速い):

dir /s /b | sort /r /+261 /o out.txt

また、260行より長い行がリストの一番上に表示されます。SORT列パラメーター(/ + n)に1を追加する必要があることに注意してください。


洗練してくれてありがとう。Powershell(Windows 2003ボックス)をインストールできなかったのは私の場合でした。投票済み
preOtep 2016

1を追加する必要がある理由を詳しく説明できますか?
Xonatron

出力ファイルを行の長さで並べ替える方法はありますか?
Xonatron

@Xonatron、 "そして260より長い行
cliffclof

賛成票を投じました。ドライブftwへのパスを短くするためのSUBSTについても言及する必要があると思います。
cliffclof

6

ここでは、PowerShellを使用する他の適切な回答に代わるものを作成しましたが、リストをファイルに保存することもできます。他の誰かがそのようなものを必要とする場合に備えて、ここでそれを共有します。

警告:コードは、現在の作業ディレクトリの「longfilepath.txt」を上書きします。すでに持っている可能性は低いと思いますが、念のために!

意図的に1行でそれを望んでいました:

Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}

詳細な手順:

  1. PowerShellを実行する
  2. ファイルパスの長さを確認するディレクトリに移動します(C:動作します)
  3. コードをコピーして貼り付けます[右クリックしてPowerShellに貼り付けるか、Alt +スペース> E> P]
  4. 完了するまで待ってから、ファイルを表示します。 cat longfilepath.txt | sort

説明:

Out-File longfilepath.txt ;–「longfilepath.txt」というタイトルの空のファイルを作成(または上書き)します。コマンドを区切るセミコロン。

cmd /c "dir /b /s /a" |– PowerShellでdirコマンドを実行して/a、隠しファイルを含むすべてのファイルを表示します。|パイプに。

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} –各行($ _で示される)について、長さが250より大きい場合は、その行をファイルに追加します。


2

stderrをリダイレクトできます。

ここでより多くの説明がありますが、次のようなコマンドがあります:

MyCommand >log.txt 2>errors.txt

探しているデータを取得する必要があります。

また、トリックとして、パスの前に\\?\msdn)が付いている場合、Windowsはその制限をバイパスします。

長いパスで始まるルートまたは宛先がある場合の別のトリックは、おそらくSUBST役立つでしょう:

SUBST Q: "C:\Documents and Settings\MyLoginName\My Documents\MyStuffToBeCopied"
Xcopy Q:\ "d:\Where it needs to go" /s /e
SUBST Q: /D

std出力とエラーをリダイレクトすることで、大きなファイルがどこにあるのかを十分に示すことができます。コマンド>ファイル2>&1
WestHamster 2012年

それは機能しますが、私のコマンドエラーを別のファイルに分割する必要があります
SeanC 2012年

\\?\もよさそうだ。ただし、次のものを機能させることはできません。xcopy/ s \\?\ Q:\ nuthatch \\?\ Q:\
finch

うーん...\\?\ コマンドラインでは機能しないようです。使用して別のアイデアを追加SUBST
SeanC 2012年

残念ながら、コマンドのタイプはxcopy / sq:\ nuthatch q:\
finch

2

http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/から:

Get-ChildItem –Force –Recurse –ErrorAction SilentlyContinue –ErrorVariable AccessDenied

最初の部分は、これとサブフォルダーを繰り返し処理します。使用と-ErrorVariable AccessDeniedは、問題のあるアイテムをPowerShell変数にプッシュすることを意味しますAccessDenied

次に、次のように変数をスキャンできます

$AccessDenied |
Where-Object { $_.Exception -match "must be less than 260 characters" } |
ForEach-Object { $_.TargetObject }

これらのファイルを気にしない場合(場合によっては適用される可能性があります)、単に-ErrorVariable AccessDeniedパーツをドロップします。


問題は、ある$_.TargetObjectへの完全なパスが含まれていないファイル違反しMAX_PATH、唯一のディレクトリ名、および親ディレクトリ名問題のファイルのを。私はRobocopy、Subst、またはXcopy以外のソリューションの検索に取り組んでおり、実用的なソリューションが見つかったら投稿します。
user66001 2015


-2

260を超えるパスの場合:
次を使用できます。

Get-ChildItem | Where-Object {$_.FullName.Length -gt 260}

14文字の例:
パスの長さを表示するには:

Get-ChildItem | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}

14より大きいパスを取得します。

Get-ChildItem | Where-Object {$_.FullName.Length -gt 14}  

スクリーンショット:
ここに画像の説明を入力してください

10より大きいファイル名の場合:

Get-ChildItem | Where-Object {$_.PSChildName.Length -gt 10}

スクリーンショット:
ここに画像の説明を入力してください


4
あなたは明らかにその問題について何も知らない。あなたが提案したものはどれもうまくいきません。読んで
n0rd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.