1

Запись сценария для резервного копирования выбранных каталогов с моего жесткого диска (C:) на внешний жесткий диск с помощью XCOPY.

Все прошло хорошо, когда я использовал одно и то же имя каталога для источника и получателя. Но когда я попытался стать немного умнее и сделать место назначения подкаталогом устаревшего главного каталога с именем "Архив", я продолжал получать ошибку "Неверный путь". Вот выдержка из того, что я пытаюсь сделать:

set/P Drive= Enter destination drive (with colon):
:: 
set BACKUPCMD= xcopy /S /D /I /Y /Q /C /T
:: 
set hour=%time:~0,2%
if "%hour:~0,1%"==" " set hour=0%time:~1,1%
SET dateNtime=%date:~10,4%-%date:~4,2%-%date:~7,2   %__%hour%:%time:~3,2%       
::
set directory=TEST
set source=%directory%
set destination=%Drive%\ARCHIVE_%dateNtime%\%directory%

%BACKUPCMD% "C:\%source%\*.*" "%destination%"

Может ли кто-нибудь помочь мне с моим синтаксисом?

1 ответ1

1

Может ли кто-нибудь помочь мне с моим синтаксисом?

Есть несколько проблем с вашим командным файлом:

  1. Опции для xcopy идут после источника и места назначения

    XCOPY source [destination] [options]
    
  2. Ваша SET dateNtime... работает.

    • Он содержит пробелы и конечные пробелы.

    • Использование %date% для предоставления решения зависит от локали, региональных и языковых настроек ОС.

    • Вместо того, чтобы пытаться исправить ваш код, я предоставил рабочий код с помощью wmic (см. Getdate)

    • Этот код работает независимо от локали ОС, языка или выбранного пользователем формата даты (панель управления / региональная), и очень легко изменить формат вывода.

Следующий пакетный файл исправляет обе эти проблемы:

@echo off
setlocal enableDelayedExpansion
set/P Drive= Enter destination drive (with colon):
:: 
set BACKUPCMD=xcopy
SET BACKUPOPTIONS=/S /D /I /Y /Q /C /T
:: 
rem get date independently of OS Locale, Language or the user's chosen date format (Control Panel/Regional).
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1-6" %%g in (`wmic Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year ^| findstr /r /v "^$"`) do (
  set _day=00%%g
  set _hours=00%%h
  set _minutes=00%%i
  set _month=00%%j
  set _seconds=00%%k
  set _year=%%l
  )
rem pad with leading zeros
set _month=%_month:~-2%
set _day=%_day:~-2%
set _hh=%_hours:~-2%
set _mm=%_minutes:~-2%
set _ss=%_seconds:~-2%
rem adjust _date as appropriate for your requirements
set _date=%_year%%_month%%_day%%_hh%%_mm%%_ss%
::
set directory=TEST
set source=%directory%
set destination=%Drive%\ARCHIVE_%_date%\%directory%

echo %BACKUPCMD% "C:\%source%\*.*" "%destination%" %BACKUPOPTIONS%

Заметки:

  • Я не уверен из вашего вопроса, какой именно формат даты вы ищете.
  • Измените значение set _date=%_year%%_month%%_day%%_hh%%_mm%%_ss% чтобы получить требуемый формат даты.
  • Удалите последнее echo когда вы довольны командой xcopy .

Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • for /f - Циклическая команда против результатов другой команды.
  • getdate - отображает дату и время независимо от локали ОС, языка или выбранного пользователем формата даты (панель управления / региональная).
  • wmic - команда инструментария управления Windows.
  • xcopy - копирует файлы и / или деревья каталогов в другую папку.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .