2016-08-24 3 views
0

시나리오 : 우리는 제품의 여러 릴리스가 있으며 각 릴리스에 대해 폴더가 기본 폴더에 만들어집니다. 다양한 릴리스에서 도움말 파일이 수정되었습니다. 모든 도움말 파일 이름이 텍스트 파일에 나열되어 있습니다. 내가하는 스크립트가 필요 다음 filenames.txt 파일에서 각 파일 이름을 가지고텍스트 파일에서 파일 이름을 선택하고 최신 파일을 찾으려면 일괄 스크립트

  1. (모든 릴리스에서) 전체 디렉토리에서 해당 이름의 파일
  2. 최신 파일을 찾기위한 검색
  3. 이 코드를 얻으려면 내가 스택 오버플로에서 발견 코드의 다양한 부분에서 도움을했다 지정된 폴더

에 복사하고이를 결합 :

,
@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 

이 코드는 작동하지 않습니다. 그리고 나는 그 오류를 알아낼 수 없다.

+0

당신이 'DIR % FFPath % \ X'DIR'으로 대체해야하는': 그래서 여기

코드입니다 "% FFPath % \를 X를!". 'dir'은 공백으로 구분 된 다중 마스크를 검색합니다 (예 :'dir * .txt * .jpg는 모든 * .txt 파일과 모든 * .jpg 파일을 나타냅니다) – Stephan

+1

_and_에 설정된 _all_ 변수에 대해 지연 확장을 사용하십시오 루프 안에서 읽으십시오! 그리고 단순히'dir'을 날짜순으로 정렬하는 것 ('/ o : d') ... – aschipfl

+0

@Stephan 당신이 제안한 변경을 시도했지만 기대했던 결과를 얻지 못했습니다. 솔루션을 찾는 다른 방법은 없습니까? 질의를 들여다 주셔서 감사합니다! – Lavanya

답변

0

다음은 wmic 명령을 사용하여 로캘과 무관 한 방식으로 마지막 수정 날짜/시간을 검색하는 가장 최근에 수정 된 파일을 검색하는 스크립트입니다 (예 : 20160824115500.000000+060).

목록 파일 .\filenames.txt에서 읽은 모든 파일 이름에 대해 디렉토리 C:\SVN\nlbavwdocsvn\rep_doc_erpln\trunk\ERPLN에 라우팅 된 디렉토리 트리에서 일치하는 파일이 반복적으로 검색되고 각각의 수정 날짜/시간 스탬프가 수집됩니다. 형식으로 인해 캐시 된 것보다 나중에 시간이 맞는지 여부를 판별하는 간단한 (-) 비교를 수행 할 수 있습니다. 기준이 충족되면 그에 따라 캐시가 업데이트됩니다.

대문자 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 
+0

이 코드를 정확히 동일하게 사용했습니다. filenames.txt 파일이있는 동일한 위치에 test3.bat 파일에 코드를 저장했습니다.파일을 두 번 클릭하면 명령 프롬프트 창이 열리지 않습니다. 그래서 나는 cmd 창에서 'cd'명령을 사용하여 폴더로 이동하여 test3.bat 파일을 실행했습니다. "시스템이. \ filenames.txt 파일을 찾을 수 없습니다"라는 오류 메시지가 나타납니다. :-(filenames.txt 파일의 파일 이름은 다음과 같이 : tsacm0100m000 tsacm0110m000 tsacm0410m000 tsacm1101m000 987과 같은 행이 파일에서 사용할 수있는 – Lavanya

+0

을 filenames.txt'가 같은 위치에있는'합니다. 배치 파일로'set "FILELIST =. \ filenames.txt"'를'set "로 대체하십시오. FILELIST = % ~ dp0filenames.txt"'... – aschipfl

관련 문제