我们知道这种方法很有效,并且可以从通讯线上运行良好... 参考。 Using forfiles with multiple file types for search mask?
for %G in (fileone, filetwo) do forfiles /P D:\hold\logs /M *.%G.* /C "cmd /c echo @path"
我们想要做的是使用这两个文件掩码:fileone和filetwo来CALL到另一个FORFILES并且加倍%% G这现在是批处理脚本.. 我想我们可能一次可以做这两个操作吗?
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 :(得分:2)
您的FORFILES命令启动一个新的CMD.EXE进程,您尝试在该进程中调用原始批处理过程中的子例程。你不能这样做 - 子进程无法访问原始进程。
相反,您可以使用附加参数执行相同的批处理文件(在这种情况下不需要CALL),并在顶部添加IF以检测附加参数并GOTO子例程。
注意 - 您在几个地方缺少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
但我认为有更好的方法。您可以使用额外的FOR / F来处理第一个FORFILES,就像处理第二个FORFILES一样。
@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。在我看来,到目前为止您编写的代码可以通过单个FORFILES完成。