0

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

  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

此代码不起作用。而且我无法弄清楚错误。

4

1 回答 1

0

这是一个用于搜索最近修改的文件的脚本,它使用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
于 2016-08-24T11:03:39.983 回答