我有多个包含资产的文件夹(每个文件夹都有包含这些资产 .mp3、.txt、.png 等的子文件夹)。我想将所有这些资产连同子文件夹一起复制到一个位置/文件夹。我能够成功运行 robocopy 命令来实现将资产连同子文件夹从一个文件夹复制到另一个文件夹:
robocopy source target /s
我将每天运行一次调度程序来复制资产。我还想将所有复制资产的名称存储在日志文件中。日志文件的名称应采用以下格式
日志当前日期.txt
例如,如果今天的日期是 2015 年 10 月 20 日...日志文件的名称应该是:
log_20151020.txt
第二天,即2015年10月21日,应该是:
log_20151021.txt
此日志文件应包含 2015 年 10 月 20 日、2015 年 10 月 21 日等日期复制的所有资产的名称。我创建了一个批处理命令(感谢@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格式)。问题:
- 这个日志文件存储在哪里?为了显示这个日志文件,我必须每天编写一个单独的命令,如下所示:
robocopy 源目标 /log:D:\ABC\logWed1021.txt /tee /s
- 我如何确保每天获得一份单独的日志副本?
- 此外,使用当前命令,日志文件包含 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
然而这里提出的其他问题仍然没有得到解答。
答案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.
答案2
这个日志文件存储在哪里?为了显示这个日志文件,我必须每天编写一个单独的命令
这是因为您没有删除最后一个echo
或添加/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
我也在聊天中说过:
您还需要更改批处理文件以获取适合您语言环境的正确日期格式。
您的 PC 上的命令提示符中的 date /t 输出是什么?
我之所以问这个问题,是因为我发现批处理文件在你的电脑上日期格式错误(但在我的电脑上是正确的)。我从来没有得到过这个问题的答复(所以日期格式仍然没有得到解决)。
作为约瑟夫正确指出他的回答无论您的语言环境如何,获取所需日期格式(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
现在,最后一步是修改日志文件格式,因为您希望包含资产名称及其扩展名:
答案3
因此,为了让 RoboCopy 仅包含文件名,需要添加 /NDL /NC /NS /NJH /NJS。
我已经多次使用过这个。