Bagaimana cara menemukan file dengan panjang jalur lebih dari 260 karakter di Windows?

87

Saya menggunakan xcopy dalam skrip Windows XP untuk menyalin direktori secara rekursif. Saya terus mendapatkan kesalahan 'Memori Tidak Cukup', yang saya mengerti adalah karena file yang saya coba salin memiliki jalur yang terlalu panjang. Saya dapat dengan mudah mengurangi panjang jalur, tetapi sayangnya saya tidak dapat menentukan file mana yang melanggar batasan panjang jalur. File yang disalin dicetak ke output standar (yang saya alihkan ke file log), tetapi pesan kesalahan dicetak ke terminal, jadi saya bahkan tidak dapat menentukan direktori mana kesalahan tersebut diberikan. .

WestHamster
sumber

Jawaban:

114

lakukan a dir /s /b > out.txtdan kemudian tambahkan panduan pada posisi 260

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

memutarkan lagi
sumber
1
dir / s / b> out.txt melakukan pekerjaan dengan baik. Terima kasih. "'Get-ChildItem' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dioperasikan atau file batch." Saya kira saya tidak memiliki PowerShell.
WestHamster
1
@WestHamster, Anda harus menjalankan perintah itu di Konsol PowerShell.
Rami A.
6
Ini memunculkan kesalahan seperti: 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.Bersamaan dengan itu, hanya jalur yang dipersingkat yang dicetak. mis D:\Dropbox\ProY...sh._setbinddata. : . Itu persis jalan yang ingin saya temukan, tapi saya tidak bisa melihat keseluruhan jalan! Ada cara lain?
MiniGod
Apakah saya satu-satunya yang tidak bisa melakukan ini? Menggunakan Win7 64 bit Home Premium, Powershell 2.0 - ketika saya membuat file uji dengan nama panjang (240 karakter) dan kemudian mengganti nama direktori di mana ia berada juga memiliki nama panjang, Get-ChildItems -r *berhenti melihat file ... hanya dir /s /bberfungsi untuk saya.
Jonas Heidelberg
Lihat jawaban saya untuk cara mencapai ini di PowerShell, memungkinkan Anda menemukan nama file yang melanggar (di atas 260 karakter) atau sebagai alternatif, mengabaikannya.
Jonno
32

Saya membuat alat Path Length Checker untuk tujuan ini, yang merupakan aplikasi GUI gratis yang bagus yang dapat Anda gunakan untuk melihat panjang jalur semua file dan direktori dalam direktori tertentu.

Saya juga telah menulis dan membuat blog tentang skrip PowerShell sederhana untuk mendapatkan file dan panjang direktori. Ini akan menampilkan panjang dan jalur ke file, dan secara opsional menuliskannya ke konsol juga. Itu tidak membatasi untuk menampilkan file yang hanya lebih dari panjang tertentu (modifikasi yang mudah dibuat), tetapi menampilkannya secara menurun, jadi masih sangat mudah untuk melihat jalur mana yang melebihi ambang batas Anda. Ini dia:

$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()
anjing mematikan
sumber
2
Skrip yang menarik, tetapi saya masih mendapatkan kesalahan ini: 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
Alat yang luar biasa !! Saya punya teman kencan yang sangat besar, ingin membuat cadangan di WD MyCloud HDD. Dengan alat ini mengetahui panjang maksimal untuk membuat struktur folder pada HDD. Terima kasih.
NJMR
Alat yang hebat! Saya menggunakannya untuk membuat skrip yang dapat menemukan semua file / folder yang memiliki jalur lebih dari 247 karakter, yang merupakan batas untuk Synology Drive Client di Windows. Kode utamanya adalah PathLengthChecker.exe RootDirectory="C:\[MyFolder]" MinLength=248, sementara echo SELECT sync_folder FROM session_table;| sqlite3.exe %LocalAppData%\SynologyDrive\data\db\sys.sqlitediperlukan untuk mendapatkan folder berbagi secara terprogram. (Jika Anda tertarik dengan kode lengkap jangan ragu untuk bertanya)
Kar.ma
Alat yang hebat, terima kasih. Untuk Rsync-Job saya antara 2 Synology NAS, saya harus mengetahui semua FILENAM lebih lama dari 143 karakter. Ini bukan keseluruhan panjang jalur, ini hanya panjang maksimal per nama file. Bagaimana saya bisa menemukan nama file seperti itu?
PeterCo
1
Hai @PeterCo, Anda masih dapat menggunakan skrip PowerShell di atas, tetapi alih-alih $_.FullNamehanya menggantinya dengan di $_.Namemana - mana; yang akan memberi Anda nama file alih-alih jalur lengkap.
deadlydog
27

Sebagai penyempurnaan solusi paling sederhana, dan jika Anda tidak dapat atau tidak ingin menginstal Powershell, jalankan saja:

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

atau (lebih cepat):

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

Dan baris yang lebih panjang dari 260 akan masuk ke daftar teratas. Perhatikan bahwa Anda harus menambahkan 1 ke parameter kolom URUTAN (/ + n).

Chungalin
sumber
Terima kasih atas perbaikannya. Itu adalah kasus saya bahwa saya tidak dapat menginstal Powershell (kotak Windows 2003). VOTED UP
preOtep
Bisakah Anda menjelaskan mengapa Anda harus menambahkan 1 secara lebih rinci?
Xonatron
Apakah ada cara untuk mengurutkan file keluaran berdasarkan panjang baris?
Xonatron
@Xonatron, "Dan garis lebih panjang dari 260"
cliffclof
Atas suara. Saya pikir ini juga harus menyebutkan SUBST untuk mempersingkat jalur menjadi drive ftw.
cliffclof
6

Saya telah membuat alternatif untuk jawaban bagus lainnya di sini yang menggunakan PowerShell, tetapi saya juga menyimpan daftar ke file. Akan membagikannya di sini jika ada orang lain yang membutuhkan sesuatu seperti itu.

Peringatan: Kode menimpa "longfilepath.txt" di direktori kerja saat ini. Saya tahu Anda tidak mungkin sudah memilikinya, tetapi untuk berjaga-jaga!

Sengaja menginginkannya dalam satu baris:

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

Instruksi rinci:

  1. Jalankan PowerShell
  2. Melintasi direktori yang ingin Anda periksa panjang jalur file (C: berfungsi)
  3. Salin dan tempel kode [Klik kanan untuk menempel di PowerShell, atau Alt + Spasi> E> P]
  4. Tunggu hingga selesai, lalu lihat file: cat longfilepath.txt | sort

Penjelasan:

Out-File longfilepath.txt ;- Membuat (atau menimpa) file kosong berjudul 'longfilepath.txt'. Titik koma untuk memisahkan perintah.

cmd /c "dir /b /s /a" |- Jalankan perintah dir di PowerShell, /auntuk menampilkan semua file termasuk file tersembunyi. |ke pipa.

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} - Untuk setiap baris (dilambangkan sebagai $ _), jika panjangnya lebih dari 250, tambahkan baris tersebut ke file.

Rani Kheir
sumber
2

Anda dapat mengarahkan stderr.

penjelasan lebih lanjut di sini , tetapi memiliki perintah seperti:

MyCommand >log.txt 2>errors.txt

harus mengambil data yang Anda cari.

Selain itu, sebagai trik, Windows melewati batasan itu jika jalur diawali dengan \\?\( msdn )

Trik lain jika Anda memiliki root atau tujuan yang dimulai dengan jalur yang panjang, mungkin SUBSTakan membantu:

SUBST Q: "C:\Documents and Settings\MyLoginName\My Documents\MyStuffToBeCopied"
Xcopy Q:\ "d:\Where it needs to go" /s /e
SUBST Q: /D
SeanC
sumber
Mengarahkan output std dan kesalahan seharusnya memberi saya indikasi yang cukup baik tentang di mana file besar itu terima kasih. perintah> file 2> & 1
WestHamster
itu akan berhasil, tetapi perintah saya harus memisahkan kesalahan menjadi file terpisah
SeanC
\\? \ terlihat bagus juga. Saya tidak bisa mendapatkan yang berikut ini untuk bekerja: xcopy / s \\? \ Q: \ nuthatch \\? \ Q: \ finch
WestHamster
hmm ... sepertinya \\?\ tidak berfungsi untuk baris perintah. Menambahkan ide lain menggunakanSUBST
SeanC
Sayangnya subst tidak akan terlalu berguna karena perintahnya adalah tipe: xcopy / sq: \ nuthatch q: \ finch <br/> dan jalur panjang tertanam di suatu tempat yang tidak diketahui di bawah nuthatch
WestHamster
2

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

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

bagian pertama hanya melakukan iterasi melalui ini dan sub-folder; menggunakan -ErrorVariable AccessDeniedcara mendorong item yang melanggar ke dalam variabel PowerShell AccessDenied.

Anda kemudian dapat memindai variabel seperti itu

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

Jika Anda tidak peduli dengan file-file ini (mungkin berlaku dalam beberapa kasus), cukup lepaskan -ErrorVariable AccessDeniedbagian tersebut.

Jonno
sumber
Masalahnya adalah, $_.TargetObjecttidak berisi jalur lengkap ke file yang melanggar MAX_PATH, hanya nama Direktori , dan nama direktori induk dari file yang melanggar. Saya sedang mencari solusi non-Robocopy atau Subst atau Xcopy, dan akan memposting ketika saya menemukan solusi yang berfungsi.
pengguna66001
2

TLPD ("direktori jalur terlalu panjang") adalah program yang menyelamatkan saya. Sangat mudah digunakan:

https://sourceforge.net/projects/tlpd/

pollaris
sumber
Chrome menandai unduhan ini karena mengandung virus
Shaun
-2

Untuk jalur yang lebih besar dari 260:
Anda dapat menggunakan:

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

Contoh pada 14 karakter:
Untuk melihat panjang jalur:

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

Dapatkan jalur lebih besar dari 14:

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

Tangkapan layar:
masukkan deskripsi gambar di sini

Untuk nama file yang lebih besar dari 10:

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

Tangkapan layar:
masukkan deskripsi gambar di sini

E235
sumber
4
Anda jelas tidak tahu tentang masalah tersebut. Tidak satu pun dari saran Anda yang berhasil. Silakan baca
tanggal