У меня есть несколько папок, содержащих ресурсы (в каждой папке есть подпапки, содержащие эти активы .mp3, .txt, .png и т.д.). Я хочу скопировать все эти активы вместе с подпапкой в одну папку / папку. Мне удалось успешно запустить команду robocopy для копирования ресурсов вместе с подпапками из одной папки в другую:

robocopy source target /s

Я буду запускать планировщик один раз в день для копирования ресурсов. Также я хотел сохранить имя всех скопированных ресурсов в файле журнала. Имя файла журнала должно быть в форме

log_currentDate.txt

например, если сегодняшняя дата 20 октября 2015 года ... имя файла журнала должно быть:

log_20151020.txt

На следующий день, т.е. 21 октября 2015 года, должно быть:

log_20151021.txt

Этот файл журнала должен содержать имена всех скопированных ресурсов 20 октября 2015 года, 21 октября 2015 года и т.д. Я создал пакетную команду (благодаря @DavidPostill) для создания журнала следующим образом:

@echo off
for /f "tokens=1-3 delims=/ " %%a in ('date /t') do (
set _date=%%a%%b%%c
)
echo robocopy source target /log:D:\ABC\log%_date%.txt

Это создает журнал с именем «logTue2010.txt» (т. Е. Формат logdayddmm). Проблема:

  1. Где хранится этот файл журнала? Чтобы сделать этот файл журнала видимым, мне приходится каждый день писать отдельную команду:

исходная цель robocopy /log:D:\ABC\logWed1021.txt /tee /s

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

РЕДАКТИРОВАТЬ 1: с помощью следующей пакетной команды мне удалось решить проблему, связанную с форматом имени файла журнала:

@ECHO OFF
for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a)
ECHO %ts:~0,8%_%ts:~8,4%
echo robocopy ship shore /log:D:\HAL\log\log_%ts:~0,8%_%ts:~8,4%.txt
robocopy Ship Shore /log:D:\HAL\log\log_%ts:~0,8%_%ts:~8,4%.txt /S

Также эта пакетная команда работала также:

@echo off
for /f "tokens=2 delims==" %%G in ('wmic OS get LocalDateTime /value') do set "_date=%%G"
set "_date=%_date:~0,8%"
echo robocopy ship shore /log:D:\HAL\log\log_%_date%.txt
robocopy ship shore /log:D:\HAL\log\log_%_date%.txt /S

Однако другие вопросы, которые здесь задаются, остаются без ответа.

3 ответа3

1

Пожалуйста, не задавайте StackExchange один и тот же вопрос. Ответили уже на https://serverfault.com/q/730450/257436 следующим образом:


Получите дату в формате YYYYMMDD независимо от региональных и региональных настроек, используя цикл for /F wmic (команда инструментария управления Windows) и подстроку переменной среды:

@echo off
for /f "tokens=2 delims==" %%G in ('wmic OS get LocalDateTime /value') do set "_date=%%G"
set "_date=%_date:~0,8%"

Есть еще варианты регистрации robocopy:

            /L : List only - don’t copy, timestamp or delete any files.
           /NP : No Progress - don’t display % copied.
      /unicode : Display the status output as Unicode text.   #
     /LOG:file : Output status to LOG file (overwrite existing log).
  /UNILOG:file : Output status to Unicode Log file (overwrite)
    /LOG+:file : Output status to LOG file (append to existing log).
 /UNILOG+:file : Output status to Unicode Log file (append)
           /TS : Include Source file Time Stamps in the output.
           /FP : Include Full Pathname of files in the output.
           /NS : No Size - don’t log file sizes.
           /NC : No Class - don’t log file classes.
          /NFL : No File List - don’t log file names.
          /NDL : No Directory List - don’t log directory names.
          /TEE : Output to console window, as well as the log file.
          /NJH : No Job Header.
          /NJS : No Job Summary.
1

Где хранится этот файл журнала? Чтобы сделать видимым этот лог-файл, я должен написать отдельную команду каждый день

Это потому, что вы не удалили последнее echo или add /s в командном файле.

Я объяснил это вчера, во время нашего длительного разговора.

Я также обновил свой ответ, чтобы сообщить вам, что вам нужно сделать:

  • Удалите последнее эхо, если вас устраивает формат даты
  • Используйте /s, если ваш исходный каталог содержит подкаталоги, которые нужно скопировать.

Вот командный файл с этими изменениями:

@echo off
for /f "tokens=1-3 delims=/ " %%a in ('date /t') do (
set _date=%%a%%b%%c
)
robocopy ship shore /log:%_date%.txt /s

Я также сказал в чате:

Вам также нужно изменить командный файл, чтобы получить правильный формат даты для вашей локали.

Что выводит date /t из командной строки на вашем ПК?

Я спросил об этом, потому что я мог видеть, что пакетный файл имел неправильный формат даты на вашем ПК (но был правильным на моем). Я никогда не отвечаю на этот вопрос (поэтому формат даты остался нефиксированным).

Как справедливо указывает в своем ответе JosefZ , лучший способ получить желаемый формат даты (log_ddmmyy.txt) независимо от вашей локали - использовать wmic .

С этими изменениями и окончательный пакетный файл становится:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=2 delims==" %%G in ('wmic OS get LocalDateTime /value') do (
  set _date=%%G
  set _date=!_date:~0,8!
  )
robocopy ship shore /log:D:\HAL\log_!_date!.txt /s
endlocal

Теперь последний шаг для вас - изменить формат файла журнала, так как вы хотите указать имя ресурса с его расширением:

  • Используйте переключатели , описанные в JosefZ «s ответ , чтобы сделать это.

  • Поэкспериментируйте с переключателями, чтобы получить нужный формат. Подсказка: я думаю, вам нужно использовать несколько из этих переключателей.

0

Таким образом, чтобы RoboCopy включал только имена файлов, необходимо добавить /NDL /NC /NS /NJH /NJS.

Я использовал это много.

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