2017-11-08 2 views
0

여러 폴더가있는 디렉토리를 검색하고 최신 파일 (.exe)을 확인하여 다른 위치로 복사해야합니다.특정 파일이 들어있는 최신 폴더 찾기

SET "src_root" 
SET "tgt_path" 
DIR "%src_root%" /B /AD /O-D /TC > "%TEMP%\dirlist.tmp" 
< "%TEMP%\dirlist.tmp" SET /P last_dir= 
XCOPY "%src_root%\%last_dir%\*.exe" "%tgt_path%"** 

이 코드는 나를 최신 폴더에있는 EXE 파일을 복사 할 수 있지만, 경우에, 최신 폴더에는 EXE가 없다, 나는 누군가가 도움이 될 수 있습니다, 최신 EXE가 들어있는 폴더에서 복사해야 나 밖으로?

+0

오, 피곤합니다. 내 나쁜 –

답변

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=c:\sourcedir" 
SET "filename=" 

FOR /f "delims=" %%a IN (
'dir /s /b /a-d "%sourcedir%\neo.7z" ' 
) DO SET "filename=%%a"&set "dirname=%%~dpa"&goto found1 

ECHO NOT found! 
GOTO :eof 

:found1 
FOR /f "delims=" %%a IN (
'dir /s /b /a-d "%sourcedir%\neo.7z" ' 
) DO IF /i "%dirname%" neq "%%~dpa" FOR /f %%s IN ('XCOPY /y /L /D "%filename%" "%%~dpa"') DO IF "%%s"=="0" SET "filename=%%a"&set "dirname=%%~dpa"&goto found1 

ECHO latest file is "%filename%" 

GOTO :EOF 

상황에 맞게 sourcedir 설정을 변경해야합니다.

필자는 테스트를 위해 neo.7z이라는 파일을 사용했습니다. 사용자가 설명하는 상황에서 고정 된 파일 이름을 가져야한다고 생각합니다. * .exe 파일로 의심의 여지가 없습니다.

매우 보행자이지만 일을 할 것입니다.

기본적으로 필요한 디렉토리 트리에 필요한 이름이있는 파일을 찾아 디렉토리에 dirname이라는 이름을 기록합니다.

해당 파일 이름을 기본 파일로 사용하여 xcopy 일치하는 다른 모든 파일 이름으로 시도하십시오. 목록 전용으로는 /L 플래그를 사용하고 사용자 개입을 제거하려면 /y 플래그를 사용하십시오. 반환 값이 1 file(s) copied 인 경우 첫 번째 토큰 만 %%s으로 선택된 f이면 선택한 파일이 나중에 있습니다. 0 file(s) copied%%s0으로 설정합니다. 즉, 선택한 파일이 더 빠름을 의미하므로 최신 파일과 디렉토리 이름을 선택하고 다시 시작하십시오.

나는 속도를 높이기 위해 사용자 운동을 떠날 것입니다. (제안 관심이있는 경우 : delayedexpansion, 서브 루틴 및 유지 - 새로운 시작점을)


개정 [약 5 배 빠른]

@ECHO OFF 
SETLOCAL 
SET "sourcedir=c:\sourcedir" 
SET "filename=" 

FOR /f "delims=" %%a IN (
'dir /s /b /a-d "%sourcedir%\neo.7z" ' 
) DO SET "candidate=%%a"&CALL :latest 

ECHO latest file is "%filename%" 
GOTO :eof 

:latest 
IF NOT DEFINED filename GOTO selectnew 

FOR /f %%s IN ('XCOPY /y /L /D "%filename%" "%candidate%"') DO IF "%%s"=="1" goto :eof 

:selectnew 
SET "filename=%candidate%" 

GOTO :EOF 

이 개정 반복적 디렉토리 검색을 방지 할 수 있습니다. 일치하는 각 파일 이름에 대해 xcopy /L 메소드를 사용하여 새로 발견 된 파일을 이전에 발견 된 파일과 비교하고 새 파일이 나중에있는 경우 새 후보를 선택하십시오. 일치하는 이름이 모두 테스트 될 때까지 계속하십시오.

+0

이것은 완벽하게 작동합니다! 하지만 지금은 내 결함이 있기 때문에, 내 디렉토리가 너무 커서, 배치는 최신 폴더를 찾는 데 너무 많은 시간이 걸린다. 어떻게 해결할 것인가? –

관련 문제