我正在尝试使用Robocopy替换cmd文件

时间:2019-07-09 03:41:22

标签: windows cmd robocopy

我已经创建了一个cmd文件,该文件使用Robocopy命令来更新PC上的某些文件,但是我无法替换该cmd文件,因为其中包含正在执行更新的Robocopy脚本。您如何替换正在执行替换的文件?

我已将cmd文件移动到另一个目录,这使我可以更新大多数文件,但仍然无法替换cmd文件。

我在Robocopy中使用的标志是/MIR /Copy:DAT /DCOPY:T

Robocopy在cmd文件处停止,我无法替换。

1 个答案:

答案 0 :(得分:1)

我看不到%SystemRoot%\System32\robocopy.exe无法复制cmd.exe当前正在处理的批处理文件的任何原因,因为在诸如文本编辑器之类的应用程序中另外打开了该批处理文件,从而防止了写访问和删除只要在应用程序中打开该文件即可。

但是,将以下代码添加到内容未知的批处理文件中可以解决此问题。

@echo off
if /I not "%~dp0" == "%TEMP%\" (
    copy /Y "%~f0" "%TEMP%" >nul 2>&1
    if exist "%TEMP%\%~nx0" (
        set "CurrentDirectory=%CD%"
        set "InitialExecution=%~dp0"
        cd /D "%TEMP%"
        "%TEMP%\%~nx0" %*
    )
)

rem Insert here other commands to execute by the batch
rem file now running from directory of temporary files.
rem The next three commands are only for demonstration.

if defined CurrentDirectory echo Initial current directory: %CurrentDirectory%
if defined InitialExecution echo Initial execution path:    %InitialExecution%
pause

set "InitialExecution="
if defined CurrentDirectory set "CurrentDirectory=" & cd /D "%CurrentDirectory%" 2>nul & (goto) 2>nul & del "%~f0"

此批处理文件首先检查是否从目录启动了临时文件。双击批处理文件时不是这种情况,除了用户偶然将批处理文件存储在目录中作为临时文件,然后在此目录中双击它。如果批处理文件未存储在临时文件目录中,则会执行以下操作:

  1. 该批处理文件将自身复制到临时文件目录(仅读取访问权限)。
  2. 它会验证文件复制是否真的成功,应该总是如此。
  3. 它定义了两个环境变量,其中包含当前目录的路径和初始执行路径以供以后使用。
  4. 它将当前目录设置为临时文件的目录。
    这样甚至可以删除批处理文件目录中的包含批处理文件的目录,该目录也是当前目录,就像双击当前用户执行的本地驱动器上存储的批处理文件一样。
  5. 批处理文件从临时目录的目录中运行,并在初始执行时将传递给批处理文件的所有参数传递给副本。

执行批处理文件的Windows命令处理器cmd.exe在临时文件目录中的副本上继续对其批处理进行处理,第一行@echo off从不返回用户启动的初始批处理文件。

现在,对临时文件目录中的初始批处理文件的副本执行批处理文件处理,并且当前目录同时也是临时文件的目录,批处理文件中的其他命令可以执行初始当前目录或初始执行目录中的所有操作批处理文件,例如更新这些目录中的文件,甚至临时或永久删除这些目录。

使用命令rem的三行注释和接下来的三行仅演示了可以执行的操作以及在初始执行时如何使用批处理文件设置的环境变量。在最初存储在临时文件目录中并由用户从此目录执行的批处理文件中,这两个环境变量不存在(很可能)。

如果从命令提示符窗口中执行了批处理文件,则批处理文件将独立于其存在而删除环境变量InitialExecution,以恢复初始环境。

最后,对于最初不在临时文件目录中执行的批处理文件,它还会删除环境变量CurrentDirectory,如果当前目录仍然存在,则将当前目录更改回初始当前目录,并从临时文件目录中删除自身

(goto) 2>nul & del "%~f0"用于删除批处理文件,而Windows命令处理器未输出任何错误消息,这是我从How to make a batch file delete itself?的Dave Benham的答案中复制的。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • call /? ...解释%~dp0%~f0%~nx0
  • cd /?
  • copy /?
  • del /?
  • echo /?
  • goto /?
  • if /?
  • pause /?
  • set /?

另请参阅有关Using command redirection operators的Microsoft文章。