出于备份原因,我创建了一个批处理文件,该文件使用 xcopy 复制目录。然后我使用 pkzip 来压缩备份文件夹(并通过正在运行的批处理文件通过电子邮件发送它),但我收到一条内存不足的错误消息。我尝试增加命令行属性中的缓冲区大小,但它不起作用。我还尝试增加缓冲区的数量,但也不起作用。有什么想法/解决方案吗?
我执行此备份例程的原因是我希望通过 Windows 计划任务自动完成这些任务。
我也遇到了这个错误:
Insufficient memory
。我在此链接中找到了相关答案:https://web.archive.org/web/20070214005534/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 命令行工具“move”只能移动同一盘符内的目录。
对我来说,问题是 xcopy 试图在包含大量此类名称的特定目录(称为 /Documents/LongNames)内复制具有很长文件名的文件。因为在我的例子中,长名称的文件都放在一起,所以我将 Documents/LongNames 子目录压缩到一个 zip 文件,因为我不经常使用它。使用 xcopy 备份 /Documents 中的所有文件现在工作得很好。 一般来说,调试大批量 xcopy 的一个好方法是让批处理文件记录它正在复制的文件。这样,当出现问题时,就更容易发现。这就是我开始发现问题的方式。