我真的很想弄清楚这一点,所以请耐心等待,并提前感谢您的帮助。我仍在努力理解正确使用FOR /F
“Delims”和“Tokens”。
编辑:最终我需要/想要做的是包含标志*EXTRA File
或Newer
日志文件中的任何行,以提取文件路径和文件名并使用 ROBOCOPY 将这些文件复制到另一个驱动器,复制的文件在日期和时间戳文件夹。
我有一个看起来像这样的 robocopy 日志文件输出:
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Friday, March 27, 2020 6:04:32 AM
Source : P:\PC_BACKUP\
Dest : X:\PC_BACKUP\
Files : *.*
Options : *.* /TS /FP /TEE /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /NP /MT:1 /R:2 /W:10
------------------------------------------------------------------------------
*EXTRA File 11.2 g 2020/03/25 06:09:27 X:\PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-09-09.mrimg
*EXTRA File 29.7 g 2020/03/26 07:33:31 X:\PC_BACKUP\DellJordan\DC0297C23493575B-10-10.mrimg
*EXTRA File 27.8 g 2020/03/26 05:10:12 X:\PC_BACKUP\P650HSG\677CFE5FA9EB27B1-10-10.mrimg
Newer 15.2 g 2020/03/27 06:36:52 P:\PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-10-10.mrimg
New File 2.2 g 2020/03/27 06:41:31 P:\PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-19-19.mrimg
Newer 31.1 g 2020/03/27 07:36:04 P:\PC_BACKUP\DellJordan\DC0297C23493575B-11-11.mrimg
New File 4.4 g 2020/03/27 07:44:55 P:\PC_BACKUP\DellJordan\DC0297C23493575B-23-23.mrimg
Newer 27.8 g 2020/03/27 05:07:37 P:\PC_BACKUP\P650HSG\677CFE5FA9EB27B1-11-11.mrimg
New File 1.8 g 2020/03/27 05:09:25 P:\PC_BACKUP\P650HSG\677CFE5FA9EB27B1-22-22.mrimg
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 6 6 6 0 0 0
Files : 74 6 68 0 0 3
Bytes : 2.266 t 82.830 g 2.185 t 0 0 68.862 g
Times : 0:16:49 0:04:12 0:00:00 0:04:12
Speed : 352546983 Bytes/sec.
Speed : 20172.900 MegaBytes/min.
Ended : Friday, March 27, 2020 6:12:56 AM
我已经设法将这个文件缩减为我想要使用的文件的路径和文件名(“Newer”和“*EXTRA File”路径)导出到日志使用:
set logname=%~1
findstr /L /G:extractnewer.txt %logname%.log > extract.log
findstr /L /G:extractextrafile.txt %logname%.log >> extract.log
setlocal DisableDelayedExpansion
for /f "tokens=1* delims=\" %%A in (extract.log) do echo %%B >> trim.log
可能有更好的方法可以做到这一点,但到目前为止它对我有用。所以 trim.log 输出看起来像这样:
PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-10-10.mrimg
PC_BACKUP\DellJordan\DC0297C23493575B-11-11.mrimg
PC_BACKUP\P650HSG\677CFE5FA9EB27B1-11-11.mrimg
PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-09-09.mrimg
PC_BACKUP\DellJordan\DC0297C23493575B-10-10.mrimg
PC_BACKUP\P650HSG\677CFE5FA9EB27B1-10-10.mrimg
最终,我需要将文件路径和文件名分开,以便我可以使用它们来进行 robocopy 文件复制。例如,它将遍历 trim.log 中的每一行:
filepath=PC_BACKUP\P650HSG\
filename=677CFE5FA9EB27B1-11-11.mrimg
所以我可以做一个:
robocopy X:\%filepath% T:\%datefolder%\%filepath%\ %filename%
但是我正在努力获得正确FOR /F
的分别提取路径和文件的方法。
感谢您的任何帮助。
由于您已经拥有文件中所需的文件路径部分
trim.log
,您可以将它用于下面的脚本解决方案并测试以确认其中任何一个都可以满足您的需要。1. 批处理脚本
2. 批处理脚本
注意: 这
Setlocal EnableDelayedExpansion
有助于处理循环中设置的变量的扩展,以便在运行时正确使用和不解析。3. 使用 PowerShell Helper 进行批处理
我放弃了尝试让它与批处理一起使用,只是添加了一个简单的 PowerShell 帮助程序来帮助连接文件路径和文件名部分,以对应
Robocopy
参数值。这仍然作为批处理文件执行,您只需要确保
trim.log
在其变量中设置完整路径和文件名,并且datefolder
变量值在这两个运行下的逻辑之前设置,以便适合您现有的脚本因此,以确保正确的顺序。更多资源
ForEach-对象
分裂()