أنا أستخدم نسخة xcopy في XP windows windows لنسخ دليل بشكل متكرر. ما زلت أتلقى خطأ "ذاكرة غير كافية" ، وهو ما أفهمه لأن الملف الذي أحاول نسخه يحتوي على مسار طويل جدًا. يمكنني بسهولة تقليل طول المسار ، لكن لسوء الحظ لا يمكنني معرفة الملفات التي تنتهك قيود طول المسار. تتم طباعة الملفات التي يتم نسخها إلى الإخراج القياسي (الذي أعيد توجيهه إلى ملف سجل) ، لكن رسالة الخطأ تتم طباعتها على الجهاز الطرفي ، لذلك لا يمكنني حتى معرفة أي دليل يتم تقديم الخطأ تقريبًا لـ .
قم بإجراء dir /s /b > out.txt
ثم قم بإضافة دليل في الموضع 260
في بوويرشيل cmd /c dir /s /b |? {$_.length -gt 260}
لقد قمت بإنشاء أداة 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()
كتحسين لأبسط الحلول ، وإذا كنت لا ترغب في تثبيت Powershell أو لا ترغب في ذلك ، فما عليك سوى تشغيل:
dir /s /b | sort /r /+261 > out.txt
أو (أسرع):
dir /s /b | sort /r /+261 /o out.txt
والخطوط التي تزيد عن 260 ستصل إلى أعلى القائمة. لاحظ أنه يجب عليك إضافة 1 إلى معلمة عمود SORT (/ + n).
لقد صنعت بديلاً للإجابات الجيدة الأخرى هنا التي تستخدم PowerShell ، لكن حفظ لي أيضًا يحفظ القائمة في ملف. سوف نشاركه هنا في حال احتاج أي شخص آخر إلى شيء من هذا القبيل.
تحذير: رمز الكتابة فوق "longfilepath.txt" في دليل العمل الحالي. أعلم أنه من غير المحتمل أن يكون لديك واحدة بالفعل ، ولكن فقط في حالة!
أراد عمدا في سطر واحد:
Out-File longfilepath.txt ; cmd /c "dir /b /s /a" | ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}}
تعليمات مفصلة:
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 ، فقم بإلحاق هذا السطر بالملف.
من 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
.
يمكنك إعادة توجيه 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
TLPD ("دليل المسار طويل للغاية") هو البرنامج الذي أنقذني. سهل جدا للاستخدام: