代码之家  ›  专栏  ›  技术社区  ›  nightsurfer

批处理文件无限运行

  •  1
  • nightsurfer  · 技术社区  · 7 年前

    请容忍我;我对编写这样的代码非常陌生,我想我已经找到了一种简单的方法,但我遇到了一些问题。我也无法通过谷歌搜索或四处查看找到答案,但如果已经找到了答案,我道歉!

    我正在中运行以下命令。bat文件:

    xcopy D:\SHARENAME \\NAS-IP-ADDRESS\SHARENAME /s /e /d
    

    当我运行它一次作为一个。bat文件,它执行其复制操作,然后关闭终端窗口,表示完成。 我可以验证是否发生了复制操作,因为新文件确实显示在备份目录中。

    然而,一旦我设置了这个。bat文件作为Windows计划任务,它从不停止运行。 复制仍会发生一次,但任务不会结束。 我想让它每天凌晨3点跑,这很好,但它在第一次跑完之后就再也没有机会跑了,因为它从来没有停过。我是否错过了结束这一切的机会。bat文件以便正确停止?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mofi    7 年前

    计划的任务没有结束,因为 X复制 在是否应覆盖目标目录中已有的文件时,提示复制该文件。没有任何人响应此提示,因此 X复制 永远等待。所以 cmd.exe 永远不会结束批处理文件的执行,因此,计划的任务也永远不会结束。

    解决方案是使用命令行:

    %SystemRoot%\System32\xcopy.exe "D:\SHARENAME" "\\NAS-IP-ADDRESS\SHARENAME\" /C /E /H /K /Q /R /Y
    

    解决此问题最重要的是选项 /Y 这样可以避免覆盖提示。

    Microsoft的 xcopy 文档当前包含以下信息:

    默认情况下,系统会提示您覆盖,除非您运行 X复制 从批处理脚本中。

    这是一个错误的信息。 X复制 是Windows系统文件夹中的可执行文件,不知道是否由 命令。exe文件 从命令提示窗口或批处理脚本中。 /Y型 必须在命令行上指定,否则存在环境变量 COPYCMD 包含 /Y型 以避免出现覆盖提示。 /Y型 在使用时不能在命令行上使用 copy 作为内部命令 命令。exe文件 使用时 复制 在批处理脚本中。

    的帮助 X复制 在命令提示窗口中运行时的输出 xcopy /? 解释上面使用的所有其他选项。在输出帮助的底部可以阅读:

    COPYCMD环境变量中可能存在开关/Y。
    这可以在命令行上用/-Y覆盖。

    命令的帮助 复制 运行时输出 copy /? 结束于:

    COPYCMD环境变量中可能存在开关/Y。
    这可以在命令行上用/-Y覆盖。 默认值为
    除非从执行COPY命令,否则在覆盖时提示
    在批处理脚本中。

    附加的第三句话在以下方面有所不同: /Y型 之间 X复制 复制 在批处理脚本中使用。

    的帮助 X复制 还包含以下内容的说明: /S /E

    /复制除空目录外的目录和子目录。
    /E复制目录和子目录,包括空目录。
    与/S/E相同。可用于修改/T。

    Same as /S /E. 是一个令人困惑的描述。许多初学者认为有必要指定 /S /E类 获取复制了空目录的整个目录结构。但事实并非如此。这意味着 /E类 足以复制整个目录结构,包括空目录和 /S /E 被解读为 /E类 .没有必要详细说明 /S (无空目录复制)除了 /E类 (使用空目录复制)打开 X复制 命令行。

    我建议阅读 SS64 - XCOPY 当前优于Microsoft文档的文档。

    使用复制一个或多个文件和目录时非常重要 X复制 进入指定的目的地 目录 正在指定末尾带有反斜杠的目标路径。这说明 X复制 目标字符串指定的是目录而不是文件。否则,有必要另外指定 /I 在复制多个文件或整个目录树时通知 X复制 目标参数应解释为文件夹路径。但是 /我 如果使用复制单个文件,则不会避免提示 X复制 并且destination参数不以反斜杠结尾,请参见 BATCH file asks for file or folder 有关详细信息。因此,强烈建议在使用将一个或多个文件复制到文件夹时,始终在末尾指定目标文件夹路径,并使用反斜杠 X复制