0

我们知道这很有效,并且从命令行运行良好......参考。使用具有多种文件类型的 forfiles 进行搜索掩码?

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

我们想要做的是使用这两个文件掩码:fileone 和 filetwo 来调用另一个 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...参考..嵌套的文件:路径和扩展过滤器

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
4

1 回答 1

2

您的 FORFILES 命令启动一个新的 CMD.EXE 进程,您尝试从该进程调用原始批处理进程中的子例程。你不能这样做 - 子进程无法访问原始进程。

相反,您可以使用附加参数执行相同的批处理文件(在这种情况下不需要调用),并在顶部添加一个 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 一样处理第一个 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。在我看来,您迄今为止编写的代码似乎可以用一个 FORFILES 来完成。

于 2013-12-19T01:37:21.717 回答