FORFILES多种用途

问题描述 投票:0回答:1

我们知道这个工程,并通过命令行...编号效果很好。 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传送到电话到另一FORFILES并与弯了腰%%表示对此现在是在一个批处理脚本..我想我们也许可以在做这两项操作一度?

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超过一次...... Ref..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
batch-file zip forfiles
1个回答
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

但我认为这是一个更好的办法。您可以处理第一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来完成。

© www.soinside.com 2019 - 2024. All rights reserved.