【问题标题】:Insufficient memory in Windows command lineWindows 命令行中的内存不足
【发布时间】:2021-07-28 14:29:05
【问题描述】:

出于备份原因,我创建了一个批处理文件,它使用 xcopy 复制目录。然后我使用 pkzip 压缩备份文件夹(并通过正在运行的批处理文件通过电子邮件发送它),但我收到一条内存不足的错误消息。我试图在命令行属性中增加缓冲区大小,但没有奏效。我也尝试增加缓冲区的数量,但它也不起作用。有什么想法/解决方案吗?

我执行此备份例程的原因是我希望这些任务通过 Windows 计划任务自动完成。

【问题讨论】:

  • 那么哪个命令给出了错误?请edit您的问题包含您的批处理文件并告诉我们哪一行给出了错误。
  • pkzip -spwd -x*.bat 2014 -rp -&,是命令,错误(35)是:内存不足。但奇怪的是,我在 3 台不同的计算机上进行了测试,其中 2 台的运行效果非常好,即使对于更大的文件(>15MB)也是如此。但是在第三个中它并不稳定,有时会弹出错误但有时不会。我猜文件夹和长子文件夹可能是由于字符大小的问题,但这只是一个假设。
  • 什么版本(和位数)的 Windows?什么版本的pkzip?如果我能理解您的pkzip 声明:未定义操作(如-add); -spwd=用密码打乱; -x*.bat=排除批处理文件2014=归档名称-rp=递归子目录和存储路径; -&=???也许在其中强加了某种递归定义:将 2004 文件归档到自身中?
  • 像这里一样使用 powershell stackoverflow.com/questions/17842764/…

标签: batch-file cmd buffer pkzip


【解决方案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.

【讨论】:

  • ROBOCOPY 比 XCOPY 好!但是 RSYNC 比 ROBOCOPY 好,4 年后我们有了 windows 子系统 linux,所以我们现在可以在 windows 上运行它。仅供参考。
  • 评论 @gunslingor 建议在 WSL Linux 中使用 rsync。它可以工作,并且您可以获得 rsync 附带的所有内容。但是,我的性能显着下降。 Windows Defender(反恶意软件)认为需要扫描使用 rsync 而不是 xcopy / robocopy 复制的每个文件。使用我的外置硬盘,xcopy 给我 180MBps,rsync 降到 15MBps。
【解决方案2】:

标准的 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”只能在同一个磁盘盘符内移动目录。

【讨论】:

    【解决方案3】:

    对我来说,问题在于 xcopy 试图在包含大量此类名称的特定目录(称为 /Documents/LongNames)中复制文件名很长的文件。因为在我的案例中,长名称的文件都放在一起,所以我将 Documents/LongNames 子目录压缩到一个 zip 文件中,因为我不经常使用它。我在 /Documents 中的所有文件的 xcopy 备份现在工作得很好。 一般来说,调试大批量 xcopy 的一个好方法是让您的批处理文件记录它正在复制的文件。因此,当出现问题时,更容易找到。我就是这样发现问题的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 2013-09-13
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多