关于批处理文件:FORFILES的多种用途

Multiple uses of FORFILES

我们知道这很有效,并且在公共电话上也能很好地工作...
参考使用具有多种文件类型的forfiles作为搜索掩码吗?

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

我们要做的是使用这两个文件掩码:fileone和filetwo调用CALL到另一个FORFILES,然后将%% G加倍,这现在在批处理脚本中。
我想我们可能可以一次完成这两个操作?

1
2
3
4
5
6
7
8
9
10
11
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

结果是:

1
2
3
4
5
6
7
8
"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 ...
引用。嵌套的文件:路径和扩展名过滤器

1
2
3
4
5
6
7
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


您的FORFILES命令启动一个新的CMD.EXE进程,您尝试从中调用原始批处理进程中的子例程。您无法执行此操作-子进程无法访问原始进程。

相反,您可以执行带有附加参数的同一批处理文件(在这种情况下不需要CALL),并在顶部添加IF以检测附加参数并转到子例程。

注意-您在几个地方缺少EXIT /B-您不想陷入以下子例程中!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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以与处理第二个FORFILE相同的方式处理第一个FORFILE。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@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来完成。