首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FORFILES的多种用途

FORFILES的多种用途
EN

Stack Overflow用户
提问于 2013-12-18 17:23:18
回答 1查看 5K关注 0票数 0

我们知道这件事在通讯线路上很有效.参考Using forfiles with multiple file types for search mask?

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

我们要做的是使用这两个文件掩码: fileone和file-2来调用另一个FORFILES,并且使用加倍的%G,这是一个批处理脚本。我想我们也许可以同时做这两种操作?

代码语言:javascript
复制
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

结果如下:

代码语言:javascript
复制
"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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-19 01:37:21

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

相反,您可以使用附加参数执行相同的批处理文件(在本例中不需要调用),并在顶部添加一个IF以检测附加参数并转到子例程中。

注意-你在几个地方错过了EXIT /B -你不想掉进下面的子程序!

代码语言:javascript
复制
@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

但我认为还有更好的方法。您可以使用额外的/F来处理第一个FORFILES,就像处理第二个FORFILES一样。

代码语言:javascript
复制
@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来完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20664506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档