2013-12-18 1 views
0

우리는 이것이 잘 작동하고 잘게 부딪쳐서 작동한다는 것을 알고 있습니다 ... Ref. .. fileone 및 filetwo을이 배치 스크립트에 지금 다른 FORFILES로하고 두 배로 %% G로 전화를 걸려면 내 생각 것 : Using forfiles with multiple file types for search mask?FORFILES를 여러 번 사용합니다.

for %G in (fileone, filetwo) do forfiles /P D:\hold\logs /M *.%G.* /C "cmd /c echo @path" 

우리가 원하는 것은이 두 파일 마스크를 사용하는 것입니다 한 번에 두 가지 작업을 모두 수행 할 수 있습니까?

SET SOMELOGS=D:\hold\logs 
for %%G in (fileone, filetwo) do forfiles /P %SOMELOGS% /M *.%%G.* /C "cmd /c ECHO @path & call :locate @path" 

:locate 
echo somepath %%1 

FOR /f "tokens=1-9 delims=/: " %aa IN ('forfiles /P "%SOMELOGS%" /M %%1 /D -1 /C "cmd /c echo @file @fdate @ftime"') DO call :ZIP %%a %%b %%c %%d %%e %%f %%g 

:ZIP 

PAUSE 

결과는 다음과 같습니다

"D:\hold\logs\server.fileone.log.2013-12-14.a" 
Invalid attempt to call batch label outside of batch script. 
"D:\hold\logs\server.fileone.log.2013-12-15.a" 
Invalid attempt to call batch label outside of batch script. 
"D:\hold\logs\server.fileone.log.2013-12-15.b" 
Invalid attempt to call batch label outside of batch script. 
"D:\hold\logs\server.fileone.log.2013-12-16.a" 
Invalid attempt to call batch label outside of batch script. 

이는 사용할 수 없습니다 .. 중 하나가 작동하지 않는 것 :/c를 한 번 이상 ... 참조를 .. nested forfiles: path and extension filter

SET SOMELOGS=D:\hold\logs 

for %%G in (fileone, filetwo) do forfiles /p %SOMELOGS% /m *.%%G.* "forfiles /p @path /M %%1 /D -1 /C "cmd /c echo @file @fdate @ftime"') DO call :ZIP %%a %%b %%c %%d %%e %%f %%g 

:ZIP 

PAUSE 
+0

루프 매개 변수에 _two_ 퍼센트 기호'%% a' ('% aa'이 아님)가 필요합니다. – Endoro

+0

OK .. 스크립트에서 %%를 업데이트했습니다. 그것을 잡아 주셔서 감사합니다. 그래도 작동이 안되는. – Leptonator

답변

2

FORFILES 명령은 원래 일} 처리 프로세스 내에서 서브 루틴 호출을 시도하는 새 CMD.EXE 프로세스를 시작합니다. 자식 프로세스는 원래의 프로세스에 액세스 할 수 없습니다.

대신에 추가 매개 변수 (이 경우 CALL이 필요 없음)를 사용하여 동일한 배치 파일을 실행할 수 있으며 추가 매개 변수를 감지하고 서브 루틴을 GOTO하려면 상단에 IF를 추가하십시오.

주 - 몇 군데에 EXIT /B이 누락되었습니다. 다음 서브 루틴에 들기를 원하지 않습니다!

@echo off 
if "%~1" equ ":locate" goto locate 
SET SOMELOGS=D:\hold\logs 
for %%G in (fileone, filetwo) do forfiles /P %SOMELOGS% /M *.%%G.* /C "cmd /c ECHO @path & 0x22%~f00x22 :locate @path" 
exit /b 

:locate 
shift /1 
echo somepath %%1 
FOR /f "tokens=1-9 delims=/: " %a IN ('forfiles /P "%SOMELOGS%" /M %%1 /D -1 /C "cmd /c echo @file @fdate @ftime"') DO call :ZIP %%a %%b %%c %%d %%e %%f %%g 
exit /b 

:ZIP 
PAUSE 
exit /b 

그러나 나는 더 좋은 방법이 있다고 생각합니다. 첫 번째 FORFILES는 FOR/F를 사용하여 두 번째 처리와 같은 방식으로 처리 할 수 ​​있습니다.

@echo off 
if "%~1" equ ":locate" goto locate 
SET SOMELOGS=D:\hold\logs 
for %%G in (fileone, filetwo) do for /f "delims=" %%F in (
    'forfiles /P %SOMELOGS% /M *.%%G.* /C "cmd /c ECHO @path"' 
) do (
    echo %%F 
    call :locate %%F 
) 
exit /b 

:locate 
echo somepath %%1 
FOR /f "tokens=1-9 delims=/: " %a IN (
    'forfiles /P "%SOMELOGS%" /M %%1 /D -1 /C "cmd /c echo @file @fdate @ftime"' 
) DO call :ZIP %%a %%b %%c %%d %%e %%f %%g 
exit /b 

:ZIP 
PAUSE 
exit /b 

마지막으로 나는 괄호로 묶은 코드 블록 안에 여러 명령을 넣을 수 있기 때문에 왜 어떤 서브 루틴이 필요한지 이해하지 못합니다. 나는 또한 왜 당신이 두 가지 수준의 정보를 필요로하는지 이해하지 못한다. 지금까지 작성한 코드가 단일 FORFILES로 수행 될 수있는 것처럼 보입니다.

+0

귀하의 도움에 감사 드리며 시간을내어 답변을드립니다. 저는 연말 목표를 폐지하려고 할 때 제게 돌아와서 답을 읽는 데 드린 사과에 대해 사과드립니다 (예, 이것도 그 중 하나입니다). :) 다시, 고마워요 !!! – Leptonator