Я использую xcopy в скрипте Windows XP для рекурсивного копирования каталога. Я продолжаю получать сообщение об ошибке «Недостаточно памяти», как я понимаю, потому, что файл, который я пытаюсь скопировать, имеет слишком длинный путь. Я могу легко уменьшить длину пути, но, к сожалению, я не могу понять, какие файлы нарушают ограничение длины пути. Копируемые файлы выводятся на стандартный вывод (который я перенаправляю в файл журнала), но сообщение об ошибке выводится на терминал, поэтому я даже не могу приблизительно определить, для какого каталога выдается ошибка. .
windows
windows-xp
xcopy
max-path
WestHamster
источник
источник
Ответы:
сделать,
dir /s /b > out.txt
а затем добавить направляющую в позиции 260В PowerShell
cmd /c dir /s /b |? {$_.length -gt 260}
источник
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.
Вместе с этим печатается только сокращенный путь. например:D:\Dropbox\ProY...sh._setbinddata
. Это именно те пути, которые я хочу найти, но не могу увидеть весь путь! Как обойти это?Get-ChildItems -r *
перестает видеть файл ...dir /s /b
работает только для меня.Для этой цели я создал средство проверки длины пути, красивое бесплатное приложение с графическим пользовательским интерфейсом, которое можно использовать для просмотра длины пути ко всем файлам и каталогам в заданном каталоге.
Я также написал и написал в блоге о простом сценарии PowerShell для получения длины файлов и каталогов. Он выведет длину и путь к файлу и, при необходимости, также запишет его в консоль. Он не ограничивает отображение файлов, длина которых превышает определенную длину (простая модификация), а отображает их по убыванию по длине, так что по-прежнему очень легко увидеть, какие пути превышают ваш порог. Вот:
источник
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.
В качестве уточнения простейшего решения, и если вы не можете или не хотите устанавливать Powershell, просто запустите:
или (быстрее):
А строки длиннее 260 попадут в начало листинга. Обратите внимание, что вы должны добавить 1 к параметру столбца SORT (/ + n).
источник
Я сделал альтернативу другим хорошим ответам здесь, в которых используется PowerShell, но мой также сохраняет список в файл. Поделюсь им здесь, если кому-то еще понадобится что-то подобное.
Предупреждение: Код перезаписывает файл 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, добавьте эту строку в файл.источник
вы можете перенаправить stderr.
дополнительные объяснения здесь , но с такой командой, как:
должен получить данные, которые вы ищете.
Кроме того, в качестве уловки Windows обходит это ограничение, если путь имеет префикс
\\?\
( msdn )Еще одна хитрость, если у вас есть корень или пункт назначения, который начинается с длинного пути, возможно
SUBST
, поможет:источник
\\?\
, не работает в командной строке. Добавлена еще одна идея с использованиемSUBST
С http://www.powershellmagazine.com/2012/07/24/jaap-brassers-favorite-powershell-tips-and-tricks/ :
первая часть просто перебирает эту и подпапки; использование
-ErrorVariable AccessDenied
означает вставку проблемных элементов в переменную powershellAccessDenied
.Затем вы можете просмотреть переменную следующим образом
Если вас не интересуют эти файлы (в некоторых случаях они могут быть применимы), просто отбросьте
-ErrorVariable AccessDenied
часть.источник
$_.TargetObject
что не содержит полный путь к файлам, которые нарушаютMAX_PATH
, только имена каталогов и имя родительского каталога файлов-нарушителей. Я работаю над поиском решения, отличного от Robocopy, Subst или Xcopy, и опубликую, когда найду рабочее решение.TLPD («слишком длинный каталог») - это программа, которая меня спасла. Очень просто использовать:
https://sourceforge.net/projects/tlpd/
источник
Для путей больше 260:
вы можете использовать:
Пример для 14 символов:
Чтобы просмотреть длины путей:
Получить пути больше 14:
Снимок экрана:
Для имен файлов больше 10:
Снимок экрана:
источник