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. .
windows
windows-xp
xcopy
max-path
WestHamster
sumber
sumber
Jawaban:
lakukan a
dir /s /b > out.txt
dan kemudian tambahkan panduan pada posisi 260Di PowerShell
cmd /c dir /s /b |? {$_.length -gt 260}
sumber
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. misD:\Dropbox\ProY...sh._setbinddata
. : . Itu persis jalan yang ingin saya temukan, tapi saya tidak bisa melihat keseluruhan jalan! Ada cara lain?Get-ChildItems -r *
berhenti melihat file ... hanyadir /s /b
berfungsi untuk saya.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:
sumber
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.
PathLengthChecker.exe RootDirectory="C:\[MyFolder]" MinLength=248
, sementaraecho SELECT sync_folder FROM session_table;| sqlite3.exe %LocalAppData%\SynologyDrive\data\db\sys.sqlite
diperlukan untuk mendapatkan folder berbagi secara terprogram. (Jika Anda tertarik dengan kode lengkap jangan ragu untuk bertanya)$_.FullName
hanya menggantinya dengan di$_.Name
mana - mana; yang akan memberi Anda nama file alih-alih jalur lengkap.Sebagai penyempurnaan solusi paling sederhana, dan jika Anda tidak dapat atau tidak ingin menginstal Powershell, jalankan saja:
atau (lebih cepat):
Dan baris yang lebih panjang dari 260 akan masuk ke daftar teratas. Perhatikan bahwa Anda harus menambahkan 1 ke parameter kolom URUTAN (/ + n).
sumber
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:
Instruksi rinci:
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,/a
untuk 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.sumber
Anda dapat mengarahkan stderr.
penjelasan lebih lanjut di sini , tetapi memiliki perintah seperti:
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
SUBST
akan membantu:sumber
\\?\
tidak berfungsi untuk baris perintah. Menambahkan ide lain menggunakanSUBST
Dari http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :
bagian pertama hanya melakukan iterasi melalui ini dan sub-folder; menggunakan
-ErrorVariable AccessDenied
cara mendorong item yang melanggar ke dalam variabel PowerShellAccessDenied
.Anda kemudian dapat memindai variabel seperti itu
Jika Anda tidak peduli dengan file-file ini (mungkin berlaku dalam beberapa kasus), cukup lepaskan
-ErrorVariable AccessDenied
bagian tersebut.sumber
$_.TargetObject
tidak berisi jalur lengkap ke file yang melanggarMAX_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.TLPD ("direktori jalur terlalu panjang") adalah program yang menyelamatkan saya. Sangat mudah digunakan:
https://sourceforge.net/projects/tlpd/
sumber
Untuk jalur yang lebih besar dari 260:
Anda dapat menggunakan:
Contoh pada 14 karakter:
Untuk melihat panjang jalur:
Dapatkan jalur lebih besar dari 14:
Tangkapan layar:
Untuk nama file yang lebih besar dari 10:
Tangkapan layar:
sumber