【问题标题】:Batch script to pick filename from a text file and find the latest file用于从文本文件中选择文件名并查找最新文件的批处理脚本
【发布时间】:2016-08-24 06:08:25
【问题描述】:

场景: 我们有一个产品的多个版本,并且对于每个版本,都会在主文件夹中创建一个文件夹。帮助文件在各种版本中进行了修改。我在文本文件中列出了所有帮助文件名。 我需要一个脚本:

  1. 从 filenames.txt 文件中获取每个文件名
  2. 在整个目录中搜索该名称的文件(在所有版本中)
  3. 查找最新文件
  4. 复制到指定文件夹

我从 Stack Overflow 上找到的各种代码中获取帮助,并将它们组合起来得到以下代码:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
echo.
FOR /F "usebackq delims=" %%a in ("filenames.txt") do (
      SET "x=%%a"
      ECHO '!x!'
      SET FFPath=C:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLN
      SET NewPath=C:\Lavanya\extracted
      SET NewestDate=20160824
      ECHO Recursively searching %FFPath%
      FOR /F %%I in ('DIR %FFPath%\ !x! /a:-d /s /b') DO (
          SET FullDate=%%~tI
          ECHO %FFPath%
          REM Set CurrDate to yyyymmdd format.  Note:  Will fail if regional settings changed.
          SET CurrDate=!FullDate:~6,4!!FullDate:~0,2!!FullDate:~3,2!

          If !CurrDate! gtr !NewestDate! (
              SET NewestDate=!CurrDate!
              SET NewestFile=%%~fI )
          ECHO Copying %NewestFile% to %NewPath%
          ECHO.
          COPY /Y "%NewestFile%" "%NewPath%"
          ECHO. 
      )
)
PAUSE

此代码不起作用。而且我无法找出错误。

【问题讨论】:

  • 您应该将DIR %FFPath%\ !x! 替换为DIR "%FFPath%\!x!"dir 会搜索多个掩码,如果以空格分隔(例如:dir *.txt *.jpg 将显示所有 *.txt 文件和所有 *.jpg 文件)
  • 对在循环中设置读取的所有变量使用延迟扩展!为什么不简单地让dir 按日期排序 (/o:d)...
  • @Stephan 我尝试了您建议的更改,但没有得到预期的结果。还有其他方法可以找到解决方案吗?感谢您花时间调查查询!
  • @aschipfl 我不允许修改目录的结构。你能详细说明你的建议吗?提前致谢。
  • 将副本拉出 for 循环!

标签: batch-file file-search


【解决方案1】:

这是一个用于搜索最近修改文件的脚本,它使用wmic 命令以独立于区域设置的方式检索上次修改日期/时间(例如,20160824115500.000000+060)。

因此,对于从列表文件.\filenames.txt 中读取的每个文件名,在目录C:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLN 路由的目录树中递归搜索匹配的文件,并收集相应的修改日期/时间戳。由于其格式,可以进行简单的大于 (GTR) 比较以确定它是否比缓存的时间点晚;如果满足条件,则相应地更新缓存。

大写的REMECHO 命令构成占位符,仅用于对文件执行的实际操作。根据需要在此处扩展脚本。变量!LASTFILE! 保存每个遇到的文件的完整路径。

代码如下:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "LOCATION=C:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLN"
set "FILELIST=.\filenames.txt"
set "WMICPROP=LastModified" & rem // {CreationDate | LastAccessed | LastModified}

pushd "%LOCATION%" || exit /B 1
for /F "usebackq eol=| delims=" %%L in ("%FILELIST%") do (
    set "LASTFILE="
    set "LASTFAGE=00000000000000.000000+000"
    for /F "eol=| delims=" %%F in ('dir /B /S /A:-D "%%~L"') do (
        set "FILE=%%F"
        setlocal EnableDelayedExpansion
        set "FILE=!FILE:\=\\!"
        for /F "tokens=2 delims==" %%J in ('
            2^> nul wmic DataFile WHERE ^(Name^="!FILE!"^) GET %WMICPROP% /VALUE ^|^| ^
                2^> nul wmic DataFile WHERE Name^="!FILE!" GET %WMICPROP% /VALUE
        ') do for /F %%I in ("%%J") do (
            endlocal
            set "FAGE=%%I"
            setlocal EnableDelayedExpansion
            if !FAGE! GTR !LASTFAGE! (
                endlocal
                set "LASTFILE=%%F"
                set "LASTFAGE=%%I"
                setlocal EnableDelayedExpansion
            )
        )
        endlocal
    )
    if defined LASTFILE (
        setlocal EnableDelayedExpansion

        REM Do whatever you want with the file here...
        ECHO Newest file: "!LASTFILE!"

        endlocal
    )
)
popd

endlocal
exit /B

【讨论】:

  • 我使用的代码完全相同。我将代码保存在 test3.bat 文件中,与放置 filenames.txt 文件的位置相同。当我双击该文件时,命令提示符窗口没有打开。因此,我在 cmd 窗口中使用“cd”命令导航到该文件夹​​并运行 test3.bat 文件。收到一条错误消息,指出“系统找不到文件 .\filenames.txt”。 :-( filenames.txt 文件中的文件名如下所示: tsacm0100m000 tsacm0110m000 tsacm0410m000 tsacm1101m000 987 这样的行在文件中可用。
  • 如果filenames.txt与批处理文件位于同一位置,请将set "FILELIST=.\filenames.txt"替换为set "FILELIST=%~dp0filenames.txt"...
猜你喜欢
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 2011-04-05
  • 2013-12-07
相关资源
最近更新 更多