मैं Windows में 260 वर्णों से अधिक पथ पथ वाली फ़ाइलों को कैसे ढूंढूं?




windows-xp xcopy (7)

मैं एक निर्देशिका को प्रतिलिपि बनाने के लिए एक एक्सपी विंडोज स्क्रिप्ट में एक एक्सकॉपी का उपयोग कर रहा हूं। मैं एक 'अपर्याप्त मेमोरी' त्रुटि प्राप्त करता रहता हूं, जिसे मैं समझता हूं क्योंकि एक फ़ाइल जिसे मैं कॉपी करने की कोशिश कर रहा हूं, बहुत लंबा रास्ता है। मैं आसानी से पथ की लंबाई को कम कर सकता हूं, लेकिन दुर्भाग्यवश मैं काम नहीं कर सकता कि कौन सी फाइलें पथ की लंबाई प्रतिबंध का उल्लंघन कर रही हैं। कॉपी की गई फ़ाइलों को मानक आउटपुट (जिसे मैं लॉग फ़ाइल पर रीडायरेक्ट कर रहा हूं) पर मुद्रित किया जाता है, लेकिन त्रुटि संदेश टर्मिनल पर मुद्रित होता है, इसलिए मैं यह भी काम नहीं कर सकता कि किस निर्देशिका में त्रुटि दी जा रही है ।


260 से अधिक पथों के लिए:
आप उपयोग कर सकते हैं:

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

14 वर्णों पर उदाहरण:
पथ की लंबाई देखने के लिए:

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

14 से अधिक पथ प्राप्त करें:

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

स्क्रीनशॉट:

10 से अधिक फ़ाइल नामों के लिए:

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

स्क्रीनशॉट:


टीएलपीडी ("बहुत लंबी पथ निर्देशिका") वह कार्यक्रम है जो मुझे बचाता है। उपयोग करने में बहुत आसान है:

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


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

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

पहला भाग सिर्फ इस और उप-फ़ोल्डरों के माध्यम से पुनरावृत्त करता है; -ErrorVariable AccessDenied का उपयोग करके अपमानजनक आइटम को AccessDenied चर AccessDenied

फिर आप वैरिएबल के माध्यम से स्कैन कर सकते हैं

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

यदि आप इन फ़ाइलों के बारे में परवाह नहीं करते हैं (कुछ मामलों में लागू हो सकते हैं), तो बस -ErrorVariable AccessDenied भाग को छोड़ -ErrorVariable AccessDenied


आप stderr पुनर्निर्देशित कर सकते हैं।

here अधिक स्पष्टीकरण, लेकिन एक आदेश जैसे:

MyCommand >log.txt 2>errors.txt

उस डेटा को पकड़ लेना चाहिए जिसे आप ढूंढ रहे हैं।

साथ ही, एक चाल के रूप में, विंडोज उस सीमा को बाईपास करता है यदि पथ \\?\ ( 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

सरल समाधान के परिष्करण के रूप में, और यदि आप पावरहेल इंस्टॉल नहीं करना चाहते हैं या नहीं, तो बस चलाएं:

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

या (तेज़):

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

और 260 से अधिक लंबी लाइनें लिस्टिंग के शीर्ष पर पहुंच जाएंगी। ध्यान दें कि आपको SORT कॉलम पैरामीटर (/ + n) में 1 जोड़ना होगा।


मैंने इस उद्देश्य के लिए पथ लंबाई परीक्षक उपकरण बनाया है , जो एक अच्छा, मुफ्त जीयूआई ऐप है जिसे आप किसी दिए गए निर्देशिका में सभी फ़ाइलों और निर्देशिकाओं की पथ लंबाई देखने के लिए उपयोग कर सकते हैं।

मैंने फ़ाइल और निर्देशिका की लंबाई प्राप्त करने के लिए एक सरल 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 का उपयोग करता है, लेकिन मेरा भी सूची में फ़ाइल को सहेजता है। अगर किसी और को ऐसा कुछ चाहिए तो उसे यहां साझा करेंगे।

चेतावनी: कोड वर्तमान कार्य निर्देशिका में "longfilepath.txt" ओवरराइट करता है। मुझे पता है कि यह असंभव है कि आप पहले से ही एक होगा, लेकिन बस मामले में!

उद्देश्य से इसे एक पंक्ति में चाहिए था:

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

विस्तृत निर्देश:

  1. पावरशेल चलाएं
  2. उस निर्देशिका के लिए जिस पर आप फ़ाइलपैथ लंबाई (सी: काम) की जांच करना चाहते हैं
  3. कोड कॉपी और पेस्ट करें [पावरशेल में पेस्ट करने के लिए राइट क्लिक करें, या Alt + Space> E> P]
  4. इसे पूरा होने तक प्रतीक्षा करें और फिर फ़ाइल देखें: cat longfilepath.txt | sort cat longfilepath.txt | sort

स्पष्टीकरण:

Out-File longfilepath.txt ; - 'longfilepath.txt' शीर्षक वाली एक खाली फ़ाइल बनाएं (या ओवरराइट करें)। आदेशों को अलग करने के लिए सेमी-कोलन।

cmd /c "dir /b /s /a" | - पावरशेल पर डीआईआर कमांड चलाएं, /a छुपी हुई फाइलों सहित सभी फाइलें दिखाने के लिए। | पाइप के लिए।

ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} ForEach-Object { if ($_.length -gt 250) {$_ | Out-File -append longfilepath.txt}} - प्रत्येक पंक्ति ($ _ के रूप में दर्शाया गया) के लिए, यदि लंबाई 250 से अधिक है, तो उस पंक्ति को फ़ाइल में संलग्न करें।





max-path