在BATCH中查找,复制和重命名

时间:2018-06-22 06:51:58

标签: batch-file

早上好!

来自我试图采用的另一篇文章,但失败了,我想在另一篇文章中提出我的问题。我需要实现两件事:

  1. 将文件名中包含特定字符串的所有文件从一个目录复制到另一个目录,但前提是该文件在该目标目录中尚不存在。文件名可能类似于EventLog_12345.txt,我只想复制文件名包含EventLog的文件。

  2. 在一组文件中,在每个.txt文件中标识特定字符串。此字符串指示包含我要查找的字符串的行。我想转到此行的末尾,并将.txt文件另存为新的.txt文件,并根据在此行末尾找到的字符串使用新名称。示例:我的文件是EventLog_12345.txt,并且在此文件的某处有这样的一行:


2018-06-22 08:21:19 0133 LET vVariable                  = 'h**ps://somedomain.com/test/1/2/4/jobs/joblog.XML'

指示行的字符串是vVariable。 在此示例中,我想在新文件名中使用的字符串是joblog.xml。该文件应存储为名称为joblog_12345.txt的新.txt文件。请注意,线的长度可以变化。域字符串的长度也可以; XML的名称也不同。不变的是我总是 希望拥有XML文件的名称,该名称始终是域的最后一部分。

添加到目前为止的工作信息
复制和粘贴-这实际上是有效的,但不会检查文件是否已存在:

@echo off  
for /f "delims=" %%a in (  
'xcopy /l /e /y "\\myPath\*EventLog*.txt" "D:\Target\" ^|find "EventLog"'
) do copy "%%a" "D:\Target\"    

对于字符串的识别,然后再另存为,我真的没有任何东西。我基本上希望我可以以某种方式调整此处提供的解决方案:(Rename text files based on multiple strings in their contents

1 个答案:

答案 0 :(得分:0)

第一次

@echo off
Set "Target=D:\Target\"
for /f "delims=" %%A in (  
  'xcopy /l /e /y "\\myPath\*EventLog*.txt" "%Target%" '
) do if not exist "%Target%%%~nxA" copy "%%A" "%Target%"

第二次

  • 处理findstr /I /M "vVariable" *_*.txt中包含%%A的vVariable的文件列表
  • 在下划线%%B上分隔找到的名称
  • 搜索文件以获取行并将行中的所有/交换为空格,然后
  • 获取%%D的最后一个元素
  • 使用%%~nD(不带扩展名)形成新名称

:: Q:\Test\2018\05\22\SO_50982243.cmd
@Echo off & Setlocal EnableDelayedExpansion
For /f "delims=" %%A in ('findstr /I /M "vVariable" *_*.txt ') Do (
    For /f "tokens=2delims=_" %%B in ("%%~nA") Do (
        For /f "delims=" %%C in ('findstr /I "vVariable" ^<"%%A"') Do Set "Line=%%C"
        Set "Line=!Line:/= !"
        For %%D in (!Line!) Do Set "NewName=%%~nD_%%B%%~xA"
        Echo Ren "%%~A" "!NewName!"
    )
)

根据您的信息采样输出

> SO_50982243.cmd
Ren "EventLog_12345.txt" "joblog_12345.txt"

如果输出正常,请删除ren前面的回声以真正重命名。