Я пытаюсь использовать Robocopy для замены файла CMD - PullRequest
1 голос
/ 09 июля 2019

Я создал cmd-файл, который использует команду Robocopy для обновления некоторых файлов на ПК, но я не могу заменить cmd-файлы, потому что он содержит скрипт Robocopy, который выполняет обновление. Как заменить файл, который выполняет замену?

Я переместил файл cmd в другой каталог, что позволяет мне обновлять большинство файлов, но я все еще не могу заменить файл cmd.

Флаги, которые я использую в Robocopy: /MIR /Copy:DAT /DCOPY:T

Robocopy остановился на файле cmd, и я не могу его заменить.

1 Ответ

1 голос
/ 09 июля 2019

Я не вижу причин для %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, выполняющий пакетный файл, продолжаетпакетная обработка файлов на своем копеy в каталоге временных файлов с первой строкой @echo off, который никогда не возвращается к исходному пакетному файлу, запущенному пользователем.

Теперь, когда обработка пакетного файла выполняется для копии исходного пакетного файла в каталоге временных файлов и с текущейкаталог также является каталогом для временных файлов, другие команды в пакетном файле могут делать все в исходном текущем каталоге, а также в каталоге начального выполнения пакетного файла, например, обновлять файлы в этих каталогах или даже удалять эти каталоги временно или навсегда.

Три строки комментария с командой rem и следующие три строки просто демонстрируют, что здесь можно сделать и как использовать переменные среды, установленные пакетным файлом при первоначальном выполнении.Две переменные среды не существуют (скорее всего) в пакетном файле, изначально сохраненном в каталоге для временных файлов и выполняемом пользователем из этого каталога.

Пакетный файл удаляет переменную среды InitialExecution независимо от егосуществование для восстановления начальной среды в случае, если пакетный файл был выполнен из окна командной строки.

Наконец, если пакетный файл изначально не был выполнен из каталога временных файлов, он удаляет также переменную среды CurrentDirectory, изменяет текущий каталог обратнов исходный текущий каталог, если этот каталог все еще существует, и удаляет себя из каталога для временных файлов.

(goto) 2>nul & del "%~f0" для пакетного удаления файла без каких-либо сообщений об ошибках, выводимых командным процессором Windows, было скопировано мной из ответа Дэйва Бенхэмана Как заставить пакетный файл удалить себя?

Для понимания используемых команд и их работы откройте окно командной строки, выполните там следующие команды иочень внимательно прочитайте все справочные страницы, отображаемые для каждой команды.

  • call /? ... объясняет %~dp0, %~f0 и %~nx0
  • cd /?
  • copy /?
  • del /?
  • echo /?
  • goto /?
  • if /?
  • pause /?
  • set /?

См. Также статью Microsoft о Использование операторов перенаправления команд .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...