我真的在努力弄清楚这一点,所以请耐心等待,并提前感谢任何帮助。我仍然在努力理解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
我已设法将此文件精简为我想要使用的文件的路径和文件名(“较新”和“* EXTRA 文件”路径),并使用以下方法导出到日志:
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
但我正在努力获取分别提取路径和文件的权利。
谢谢您的帮助。
答案1
由于您已经拥有文件中所需的文件路径部分trim.log
,因此您可以将其用于下面的脚本解决方案并进行测试以确认其中任何一个都可以满足您的需要。
1.批处理脚本
For /f "delims=\ tokens=1-5" %%A IN (trim.log) DO (
robocopy X:\%%~A\%%~B T:\%datefolder%\%%~A\%%~B\ %%~C
)
2.批处理脚本
笔记: 这Setlocal EnableDelayedExpansion
有助于处理循环中设置的变量的扩展,以便正确使用而不是在运行时进行解析。
Setlocal EnableDelayedExpansion
For /f "delims=\ tokens=1-5" %%A IN (trim.log) DO (
SET "filepath=%%~A\%%~B"
SET "filename=%%~C"
robocopy X:\!filepath! T:\%datefolder%\!filepath!\ !filename!
)
3. 使用 PowerShell 助手进行批处理
我放弃尝试让它与批处理一起工作,只是添加了一个简单的 PowerShell 帮助程序来帮助根据参数Robocopy
值连接文件路径和文件名部分。
这仍然作为批处理文件执行,您只需确保trim.log
在其变量中设置了完整路径和文件名,并且datefolder
在运行这两个逻辑之前设置了变量值,以便相应地适合您现有的脚本以确保正确的顺序。
SET "tFile=C:\Folder\Path\trim.log"
SET "datefolder=20200328"
SET PSScript=%temp%\PS~TrimTemp.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
ECHO Get-Content "%tFile%" ^| %%{ > "%PSScript%"
ECHO $path = (Split-Path "\$_" -Parent); >> "%PSScript%"
ECHO $path = (($path.split("\")[1..999]) -join "\"); >> "%PSScript%"
ECHO $fname = ($_.Split("\")[-1]).Trim(); >> "%PSScript%"
ECHO If($path){Robocopy "X:\$path" "T:\%datefolder%\$path" $fname } >> "%PSScript%"
ECHO }; >> "%PSScript%"
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"