从日志文件中提取文件路径和文件名的批处理文件

从日志文件中提取文件路径和文件名的批处理文件

我真的在努力弄清楚这一点,所以请耐心等待,并提前感谢任何帮助。我仍然在努力理解FOR /F“Delims”和“Tokens”的正确用法。

编辑:最终我需要/想要做的是包含标志*EXTRA FileNewer日志文件的任何行,提取文件路径和文件名,然后使用 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%'"

更多资源

相关内容