Недостаточно памяти в командной строке Windows
Я создал командный файл, который копирует каталог с xcopy по причинам резервного копирования. Затем я использую pkzip, чтобы заархивировать папку резервной копии (и отправить ее по электронной почте через работающий пакетный файл), но я получаю сообщение об ошибке из-за недостатка памяти. Я попытался увеличить размер буфера в свойствах командной строки, но это не сработало. Я также пытался увеличить количество буферов, но это тоже не сработало. Если у вас есть какие-либо мысли / решения, я буду рад их попробовать.
Причина, по которой я делаю эту процедуру резервного копирования, заключается в том, что я хочу, чтобы эти задачи выполнялись автоматически с помощью задач расписания Windows.
Заранее спасибо,
Панос
1 ответ
Я тоже получил эту ошибку: Insufficient memory
, Я нашел соответствующий ответ по этой ссылке: http://www.terminally-incoherent.com/blog/2007/02/05/xcopy-insufficient-memory/
Похоже, что это сообщение появляется, когда полное имя (т. Е. С путем) скопированного файла длиннее 254 символов, что кажется максимальной длиной пути Windows.
В заключение - xxcopy работает, но robocopy работает лучше.
Наконец мой командный файл выглядит так
@echo off
ROBOCOPY "H:\Laptop-Backup" "E:\Laptop-Backup" /s
rem /e: Include directories and sub directories even if empty
REM /s Copy Subdirectories, but not empty ones.
Надеюсь, поможет.
Стандартные инструменты командной строки Windows, такие как xcopy, rmdir, не могут работать с путями, превышающими MAX_PATH(260 символов). Если вы хотите удалить каталог, содержащий такой файл, полный путь которого длиннее MAX_PATH, или если вы хотите рекурсивно скопировать каталог в такое место, где полный путь хотя бы к одному из его файлов будет длиннее MAX_PATH, тогда эти инструменты командной строки не работают.
Однако вы можете обойти это с помощью инструмента командной строки "move", потому что, в отличие от xcopy и rmdir (rd), кажется, что он не выполняет итерацию файлов в каталоге один за другим. Этот обходной путь может быть не всегда удобным и требует дополнительных действий, но для целей автоматизации / написания сценариев я не вижу другого способа, если вы не можете или не хотите использовать специальные инструменты, такие как robocopy. Этот способ работает с каталогом, но не с отдельным файлом. Приведу пример.
Создайте каталог. Длина пути: 245 символов
E:\>mkdir E:\veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongdirectory
Чтобы создать файл внутри него, чтобы длина пути к файлу была больше MAX_PATH. Обычным способом это не сработает.
E:\>echo "content" > E:\veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongdirectory\longlonglonglonglongfilename.txt
The system cannot find the path specified.
Обходной путь: создайте файл (ы) с коротким путем и переместите каталог, содержащий файл (ы), на длинный путь.
E:\>echo "content" > somedir\longlonglonglonglongfilename.txt
E:\>move somedir E:\veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongdirectory\
1 dir(s) moved.
Проверка 1. Был ли каталог полностью перемещен (со всеми файлами)? - Да.
E:\>dir E:\veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongdirectory\somedir
Volume in drive E is Workspace
Volume Serial Number is C864-7C96
Directory of E:\veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongdirectory\somedir
08/09/2019 11:52 AM <DIR> .
08/09/2019 11:52 AM <DIR> ..
08/09/2019 11:52 AM 12 longlonglonglonglongfilename.txt
1 File(s) 12 bytes
2 Dir(s) 130,574,221,312 bytes free
Проверка 2. Путь действительно длиннее MAX_PATH, поэтому он не будет доступен по полному пути для обычных инструментов командной строки, поэтому мы сделали все правильно:
E:\>dir E:\veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongdirectory\somedir\longlonglonglonglongfilename.txt
Volume in drive E is Workspace
Volume Serial Number is C864-7C96
Directory of E:\veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongdirectory\somedir
File Not Found
Тот же обходной путь действителен, если вы хотите удалить (с помощью rmdir) каталог, содержащий подпапки / файлы, путь которых длиннее MAX_PATH. Просто переместите верхний каталог в какое-нибудь короткое временное место и там вы сможете его rmdir.
ПРИМЕЧАНИЕ. Инструмент командной строки Windows "перемещение" может перемещать каталоги только в пределах одной буквы диска.
Для меня проблема заключалась в том, что xcopy пытался скопировать файлы с очень длинными именами внутри определенного каталога (назовите его /Documents/LongNames), содержащего множество этих типов имен. Поскольку в моем случае файлы с длинными именами были объединены, я заархивировал подкаталог Documents/LongNames в один zip-файл, поскольку я не использую его часто. Резервное копирование всех моих файлов в /Documents с помощью xcopy теперь работает нормально. В общем, хороший способ отладки xcopy большого пакета - сделать так, чтобы ваш пакетный файл регистрировал файлы, которые он копирует. Поэтому, когда есть проблема, ее легче найти. Вот как я обнаружил проблему.