在BATCH中仅保留一部分文件名

时间:2018-06-24 19:49:11

标签: batch-file

关于this问题,我试图将建议的脚本调整为已更改的需求,但是失败了。这是上下文:

  • 下面的脚本可解析一组名称为EventLog_12345.txt的文件
  • 在每个文件中,它标识包含字符串vVariable的行(示例2018-06-22 08:21:19 0133 LET vVariable = 'h**ps://somedomain.com/test/joblog.XML'
  • 它在此行的末尾(joblog)获得URL的文件名
  • 将文件另存为新文件,名称为:joblog_12345.txt

  • 以下是推荐的帖子中建议的脚本,它可以完成工作。

    :: 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!"
       )
    )
    
  • 但是,当我尝试对一组具有不同名称的文件执行相同的操作时,我拼命失败(我花了*_*.txt来完成此操作,但是没有成功。)

  • 我需要识别的文件名看起来像这样:Worker FFM Generator.qcc.2018_06_24_14_46_55.txt,直到数字开始为止的所有内容都是一个常数-因此文件名仅在数字部分有所不同。最终,我想将一个新文件(从上面拾取示例行)另存为joblog_2018_06_24_14_46_55.txt

非常感谢!

1 个答案:

答案 0 :(得分:2)

在最里面的for /F循环上,将"%%A"更改为"%%~A""%%~fA"。照原样,您的包含空格的文件名将用引用的结果填充%%A。因此,for /F可能正在尝试执行以下操作:

findstr /I "vVariable" ^<""Worker FFM Generator.qcc.2018""

...这是不正确的。添加波浪号将去除内部引号(如果存在),从而使您的显式引号有效。

供以后参考,使用@echo on可以帮助您查找诸如此类的简单错误,从而使您看到脚本在哪些地方表现不正常。

如果脚本与日志文件不在同一目录中,则还应在pushd directoryname下添加@echo off,并在其中包含“ Worker FFM Generator等”的目录名称。代替directoryname。如果您需要脚本来递归搜索文件,请将/S开关添加到findstr