AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1536453
Accepted
HTWingNut
HTWingNut
Asked: 2020-03-28 10:44:33 +0800 CST2020-03-28 10:44:33 +0800 CST 2020-03-28 10:44:33 +0800 CST

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

  • 772

我真的很想弄清楚这一点,所以请耐心等待,并提前感谢您的帮助。我仍在努力理解正确使用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的分别提取路径和文件的方法。

感谢您的任何帮助。

windows command-line
  • 1 1 个回答
  • 1396 Views

1 个回答

  • Voted
  1. Best Answer
    Vomit IT - Chunky Mess Style
    2020-03-28T13:00:06+08:002020-03-28T13:00:06+08:00

    由于您已经拥有文件中所需的文件路径部分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 Helper 进行批处理

    我放弃了尝试让它与批处理一起使用,只是添加了一个简单的 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%'"
    

    更多资源

    • 为 /F
    • Setlocal EnableDelayedExpansion
    • 获取内容
    • ForEach-对象

      Foreach-Object 的标准别名%:' ' 符号,ForEach

    • 分裂()

    • 分割路径
    • 调用命令
    • 2

相关问题

  • Python 的“pass”参数的批处理等价物是什么?

  • 禁用后无法启用 Microsoft Print to PDF

  • 在 Windows 上与 Docker 守护进程通信

  • 资源管理器侧面板中的桌面外壳快捷方式

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve