Windows'ta 260 karakterden daha uzun yol uzunluğuna sahip dosyaları nasıl bulabilirim?


87

Bir dizini yinelemeli olarak kopyalamak için bir XP Windows komut dosyasında bir xcopy kullanıyorum. Sürekli olarak 'Yetersiz Bellek' hatası alıyorum, bunu anlıyorum çünkü kopyalamaya çalıştığım bir dosyanın çok uzun bir yolu var. Yol uzunluğunu kolayca kısaltabilirim, ancak ne yazık ki hangi dosyaların yol uzunluğu kısıtlamasını ihlal ettiğini bulamıyorum. Kopyalanan dosyalar standart çıktıya (bir günlük dosyasına yönlendiriyorum) yazdırılıyor, ancak hata mesajı terminale yazdırılıyor, bu nedenle hatanın hangi dizin için verildiğini yaklaşık olarak hesaplayamıyorum .


Yanıtlar:


114

a yapın dir /s /b > out.txtve sonra 260. pozisyonda bir kılavuz ekleyin

Powershell'de cmd /c dir /s /b |? {$_.length -gt 260}


1
dir / s / b> out.txt işi güzelce yapar. Teşekkürler. "Get-ChildItem 'dahili veya harici bir komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmıyor." Sanırım benim powershell'im yok.
WestHamster

1
@WestHamster, bu komutu PowerShell Konsolunda çalıştırmanız gerekecek.
Rami A.

6
Şuna benzer bir hatayı dağıtır: 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.Bununla birlikte, yalnızca kısaltılmış bir yol yazdırılır. örneğin: D:\Dropbox\ProY...sh._setbinddata. Bunlar tam olarak bulmak istediğim yollar, ama bütün yolu göremiyorum! Bunun etrafında herhangi bir yolu var mı?
MiniGod

Bunu çalıştıramayan tek kişi ben miyim? Win7 64 bit Home Premium, Powershell 2.0 kullanarak - uzun bir adla (240 karakter) bir test dosyası oluşturduğumda ve daha sonra bulunduğu dizini uzun bir ada sahip olacak şekilde yeniden adlandırdığımda Get-ChildItems -r *, dosyayı görmeyi bırakıyor ... sadece dir /s /bçalışıyor benim için.
Jonas Heidelberg

Bunu powershell'de elde etmenin bir yolu için cevabımı görün, sorun teşkil eden dosya adlarını (260 karakterin üzerindekiler) bulmanızı veya alternatif olarak onları görmezden gelin.
Jonno

32

Bu amaçla, belirli bir dizindeki tüm dosya ve dizinlerin yol uzunluklarını görmek için kullanabileceğiniz hoş, ücretsiz bir GUI uygulaması olan Yol Uzunluğu Denetleyicisi aracını oluşturdum .

Dosya ve dizin uzunluklarını almak için basit bir PowerShell betiği hakkında da yazdım ve blog yazdım . Bir dosyanın uzunluğunu ve yolunu çıkaracak ve isteğe bağlı olarak konsola da yazacaktır. Yalnızca belirli bir uzunluğun üzerindeki dosyaları görüntülemeyle sınırlı değildir (yapılması kolay bir değişiklik), ancak bunları uzunluklarına göre azalan şekilde görüntüler, bu nedenle hangi yolların eşiğin üzerinde olduğunu görmek hala çok kolaydır. İşte burada:

$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
İlginç bir komut dosyası, ancak yine de şu hatayı alıyorum: 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

Mükemmel araç !! Büyük bir randevum vardı, bir WD MyCloud HDD'de bir yedek oluşturmak istedim. Bu araçla, HDD'de bir klasör yapısı oluşturmak için maksimum uzunluğu öğrenmeye geldi. Teşekkürler.
NJMR

Harika bir araç! Bunu, Windows'taki Synology Drive Client sınırı olan 247 karakterden daha uzun bir yola sahip tüm dosyaları / klasörleri bulabilen bir komut dosyası oluşturmak için kullandım. Ana kod edilir PathLengthChecker.exe RootDirectory="C:\[MyFolder]" MinLength=248iken echo SELECT sync_folder FROM session_table;| sqlite3.exe %LocalAppData%\SynologyDrive\data\db\sys.sqliteprogramlı paylaşım klasörleri almak gerekiyordu. (Kodun tamamı ile ilgileniyorsanız, sormaktan çekinmeyin)
Kar.ma

Harika bir araç, teşekkürler. 2 Synology NAS arasındaki Rsync-Job'um için, 143 karakterden uzun tüm FILENAMES'leri bilmeliyim. Bu tüm yol uzunluğu değil, yalnızca dosya adı başına maksimum uzunluktur. Bu tür dosya adlarını nasıl bulabilirim?
PeterCo

1
Hey @PeterCo, yukarıdaki PowerShell betiğini kullanmaya devam edebilirsiniz, ancak kullanmak $_.FullNameyerine onu $_.Nameher yerde kullanmak yerine ; bu size tam yol yerine dosya adını verecektir.
deadlydog

27

En basit çözümün iyileştirilmesi olarak ve Powershell'i yükleyemiyorsanız veya kurmak istemiyorsanız, şunu çalıştırın:

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

veya (daha hızlı):

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

Ve 260'tan uzun satırlar listenin başına gelecektir. SIRALA sütun parametresine (/ + n) 1 eklemeniz gerektiğini unutmayın.


Ayrıntılandırma için teşekkürler. Powershell'i (Windows 2003 kutusu) yükleyemediğim durum benim durumumdu. UP OY
preOtep

Neden 1 eklemeniz gerektiğini daha ayrıntılı olarak açıklayabilir misiniz?
Xonatron

Çıktı dosyasını satır uzunluğuna göre sıralamanın bir yolu var mı?
Xonatron

@Xonatron, "Ve 260'tan uzun çizgiler"
cliffclof

Yukarı oy verildi. Bence bu, bir sürücüye giden yolu kısaltmak için SUBST'den de bahsetmelidir ftw.
cliffclof

6

Burada PowerShell kullanan diğer iyi cevaplara bir alternatif yaptım, ancak benimki de listeyi bir dosyaya kaydediyor. Başkasının böyle bir şey istemesi durumunda burada paylaşacak.

Uyarı: Kod, geçerli çalışma dizinindeki "longfilepath.txt" dosyasının üzerine yazar. Zaten sahip olmanın pek olası olmadığını biliyorum, ama her ihtimale karşı!

Bilerek tek bir satırda istedim:

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

Detaylı talimatlar:

  1. PowerShell'i çalıştırın
  2. Dosya yolu uzunluklarını kontrol etmek istediğiniz dizine gidin (C: çalışır)
  3. Kodu kopyalayıp yapıştırın [PowerShell'e yapıştırmak için sağ tıklayın veya Alt + Boşluk> E> P]
  4. Tamamlanana kadar bekleyin ve ardından dosyayı görüntüleyin: cat longfilepath.txt | sort

Açıklama:

Out-File longfilepath.txt ;- 'longfilepath.txt' başlıklı boş bir dosya oluşturun (veya üzerine yazın). Komutları ayırmak için noktalı virgül.

cmd /c "dir /b /s /a" |- /aGizli dosyalar dahil tüm dosyaları göstermek için PowerShell'de dir komutunu çalıştırın . |boru için.

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} - Her satır için ($ _ olarak gösterilir), uzunluk 250'den fazlaysa, bu satırı dosyaya ekleyin.


2

stderr'i yeniden yönlendirebilirsiniz.

burada daha fazla açıklama var , ancak şöyle bir komut var:

MyCommand >log.txt 2>errors.txt

aradığınız verileri almalısınız.

Ayrıca, bir hile olarak, yolun önünde \\?\( msdn ) varsa Windows bu sınırlamayı atlar.

Uzun bir yolla başlayan bir kökünüz veya hedefiniz varsa başka bir numara, belki SUBSTyardımcı olabilir:

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

Standart çıktının ve hataların yeniden yönlendirilmesi bana büyük dosyanın nerede olduğuna dair yeterince iyi bir gösterge sağlamalıdır. command> file 2> & 1
WestHamster

Bu çalışacaktır ancak benim komut gereken ayrı bir dosyaya hataları ayırmak
SeanC

\\? \ da iyi görünüyor. Yine de aşağıdakileri çalıştıramıyorum: xcopy / s \\? \ S: \ nuthatch \\? \ S: \ finch
WestHamster

hmm ... \\?\ komut satırı için çalışmıyor gibi görünüyor . Kullanarak başka bir fikir eklendiSUBST
SeanC

Maalesef, komut çok kullanışlı olmayacak çünkü komut şu türden: xcopy / sq: \ nuthatch q: \ finch <br/> ve uzun yol, nuthatch altında bilinmeyen bir yere gömülü
WestHamster

2

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

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

ilk bölüm bunu ve alt klasörleri yineliyor; -ErrorVariable AccessDeniedaraçları kullanma , rahatsız edici öğeleri powershell değişkenine itin AccessDenied.

Daha sonra değişkeni şu şekilde tarayabilirsiniz

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

Bu dosyalar umurunuzda değilse (bazı durumlarda geçerli olabilir), sadece -ErrorVariable AccessDeniedparçayı bırakın .


Sorun şu ki, ihlal eden dosyaların$_.TargetObject tam yolunu içermiyor , yalnızca Dizin adlarını ve sorun teşkil eden dosyaların ana dizin adını içermiyor . Robocopy olmayan veya Subst veya Xcopy çözümü bulmaya çalışıyorum ve çalışan bir çözüm bulduğumda göndereceğim. MAX_PATH
user66001


-2

260'tan büyük yollar için:
şunları kullanabilirsiniz:

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

14 karakterle ilgili örnek:
Yol uzunluklarını görüntülemek için:

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

14'ten büyük yolları alın:

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

Ekran görüntüsü:
görüntü açıklamasını buraya girin

10'dan büyük dosya adları için:

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

Ekran görüntüsü:
görüntü açıklamasını buraya girin


4
Belli ki konu hakkında hiçbir fikriniz yok. Önerdiğiniz hiçbiri işe yaramıyor. Lütfen okumak
n0rd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.