it-swarm.asia

كيف يمكنني العثور على ملفات بطول مسار أكبر من 260 حرفًا في Windows؟

أنا أستخدم نسخة xcopy في XP windows windows لنسخ دليل بشكل متكرر. ما زلت أتلقى خطأ "ذاكرة غير كافية" ، وهو ما أفهمه لأن الملف الذي أحاول نسخه يحتوي على مسار طويل جدًا. يمكنني بسهولة تقليل طول المسار ، لكن لسوء الحظ لا يمكنني معرفة الملفات التي تنتهك قيود طول المسار. تتم طباعة الملفات التي يتم نسخها إلى الإخراج القياسي (الذي أعيد توجيهه إلى ملف سجل) ، لكن رسالة الخطأ تتم طباعتها على الجهاز الطرفي ، لذلك لا يمكنني حتى معرفة أي دليل يتم تقديم الخطأ تقريبًا لـ .

75
WestHamster

قم بإجراء dir /s /b > out.txt ثم قم بإضافة دليل في الموضع 260

في بوويرشيل cmd /c dir /s /b |? {$_.length -gt 260}

95
rerun

لقد قمت بإنشاء أداة Path Length Checker لهذا الغرض ، وهو تطبيق واجهة المستخدم الرسومية لطيف ، ويمكنك استخدامه لرؤية أطوال مسار جميع الملفات والدلائل في دليل معين.

لقد قمت أيضًا بكتابة ومدونة حول برنامج نصي بسيط من 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()
28
deadlydog

كتحسين لأبسط الحلول ، وإذا كنت لا ترغب في تثبيت Powershell أو لا ترغب في ذلك ، فما عليك سوى تشغيل:

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

أو (أسرع):

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

والخطوط التي تزيد عن 260 ستصل إلى أعلى القائمة. لاحظ أنه يجب عليك إضافة 1 إلى معلمة عمود SORT (/ + n).

22
Chungalin

لقد صنعت بديلاً للإجابات الجيدة الأخرى هنا التي تستخدم PowerShell ، لكن حفظ لي أيضًا يحفظ القائمة في ملف. سوف نشاركه هنا في حال احتاج أي شخص آخر إلى شيء من هذا القبيل.

تحذير: رمز الكتابة فوق "longfilepath.txt" في دليل العمل الحالي. أعلم أنه من غير المحتمل أن يكون لديك واحدة بالفعل ، ولكن فقط في حالة!

أراد عمدا في سطر واحد:

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

تعليمات مفصلة:

  1. تشغيل PowerShell
  2. انتقل إلى الدليل الذي تريد التحقق من أطوال filepath (C: الأشغال)
  3. انسخ الشفرة والصقها [انقر بزر الماوس الأيمن للصق في PowerShell ، أو Alt + Space> E> P]
  4. انتظر حتى يتم الانتهاء ثم قم بعرض الملف: cat longfilepath.txt | sort

تفسير:

Out-File longfilepath.txt ; - إنشاء (أو استبدال) ملف فارغ بعنوان "longfilepath.txt". شبه القولون لفصل الأوامر.

cmd /c "dir /b /s /a" | - تشغيل الأمر dir على PowerShell ، /a لإظهار جميع الملفات بما في ذلك الملفات المخفية. | للأنابيب.

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} - لكل سطر (يُشار إليه بـ $ _) ، إذا كان الطول أكبر من 250 ، فقم بإلحاق هذا السطر بالملف.

3
Rani Kheir

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

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

الجزء الأول يتكرر فقط من خلال هذا والمجلدات الفرعية ؛ باستخدام -ErrorVariable AccessDenied يعني دفع العناصر المخالفة إلى متغير powerhell AccessDenied.

يمكنك بعد ذلك إجراء مسح ضوئي للمتغير مثل ذلك

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

إذا كنت لا تهتم بهذه الملفات (قد تكون قابلة للتطبيق في بعض الحالات) ، فما عليك سوى إسقاط الجزء -ErrorVariable AccessDenied.

2
Jonno

يمكنك إعادة توجيه stderr.

مزيد من الشرح هنا ، ولكن الحصول على أمر مثل:

MyCommand >log.txt 2>errors.txt

يجب الاستيلاء على البيانات التي تبحث عنها.

أيضًا ، كخدعة ، يتجاوز Windows هذا القيد إذا كان المسار مسبوقًا بـ \\?\ ( msdn )

خدعة أخرى إذا كان لديك جذر أو وجهة تبدأ بمسار طويل ، ربما SUBST سوف تساعد:

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

TLPD ("دليل المسار طويل للغاية") هو البرنامج الذي أنقذني. سهل جدا للاستخدام:

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

1
pollaris