Как найти файлы с длиной пути более 260 символов в Windows?

StackOverflow https://stackoverflow.com//questions/12697259

Вопрос

Я использую XCopy в скрипте XP Windows, чтобы рекурсивно скопировать каталог.Я продолжаю получать ошибку «недостаточно памяти», которую я понимаю, это потому, что файл, который я пытаюсь скопировать, имеет слишком длинный путь.Я могу легко уменьшить длину пути, но, к сожалению, я не могу работать, какие файлы нарушают ограничение длины пути.Файлы, которые скопированы, печатаются на стандартный выход (который я перенаправляю в файл журнала), но сообщение об ошибке печатается к терминалу, поэтому я даже не могу работать, примерно в каком каталоге ошибка для,

Это было полезно?

Решение

Делайте генеракодицетагкод, а затем добавьте руководство в положении 260

в PowerShell dir /s /b > out.txt

Другие советы

Я создал Инструмент проверки длины пути для этой цели, который является хорошим, бесплатное приложение GUI, котороеВы можете использовать, чтобы увидеть длину пути всех файлов и каталогов в данном каталоге.

Я также написано и блогирован простым сценарием PowerShell Для получения длины файла и каталога.Он выводит длину и путь к файлу, а также необязательно писать его на консоль.Он не ограничивает отображение файлов, которые находятся только на определенной длине (легкая модификация для создания), но отображает их спускаться по длине, поэтому все равно Super легко увидеть, какие пути превышают ваш порог.Вот оно:

$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, чтобы сортировать параметр столбца (/ + 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}}
.

Подробные инструкции:

  1. запустить PowerShell
  2. Traverse в каталог, который вы хотите проверить наличие длины FilePath (C: Works)
  3. Скопируйте и вставьте код [правой кнопкой мыши, чтобы вставить в PowerShell или ALT + Space> E> P]
  4. ждать, пока он не сделает, а затем просмотрите файл: cat longfilepath.txt | sort
  5. <Сильные> Объяснение:

    Out-File longfilepath.txt ; - Создание (или перезаписать) пустой файл под названием «LongfilePath.txt». Полуголон для отдельных команд.

    cmd /c "dir /b /s /a" | - Запустите команду DIR на PowerShell, /a, чтобы показать все файлы, включая скрытые файлы. Генеракодицетагкод к трубе.

    | - для каждой строки (обозначается как $ _), если длина превышает 250, добавьте эту строку в файл.

Вы можете перенаправить STDERR.

Больше объяснения Здесь , но имея команду как:

MyCommand >log.txt 2>errors.txt
.

должен взять данные, которые вы ищете.

Кроме того, в качестве трюка Windows обходит это ограничение, если путь префиксирован \\?\ ( MSDN )

Еще один трюк Если у вас есть root или место назначения, который начинается с длинного пути, возможно, SUBST поможет:

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

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

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

Первая часть просто итерация через это и подпапки;Использование -ErrorVariable AccessDenied означает толкать оскорбительными элементами в переменную PowerShell RenacodicCode.

Вы можете отсканировать через переменную, как так

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

Если вам все равно, если вы не заботитесь об этих файлах (могут быть применимы в некоторых случаях), просто отбросьте часть AccessDenied.

TLPD («Слишком длинный путь к патоку») - это программа, которая сохранила меня. Очень просто в использовании:

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

для путей больше 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}
.

Скриншот:

Введите описание изображения здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top