0

これが機能し、コマンドラインからうまく機能することはわかっています...参照。検索マスクに複数のファイルタイプを持つ forfiles を使用していますか?

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

私たちがやりたいことは、これらの 2 つのファイル マスクを使用することです: fileone と filetwo を使用して、別の FORFILES を呼び出します。%%G を 2 倍にすると、これはバッチ スクリプトになります。一度?

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 複数回... 参照..ネストされた forfiles: パスと拡張子フィルタ

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 プロセスを起動し、そこから元のバッチ プロセス内のサブルーチンを呼び出そうとします。それはできません-子プロセスは元のプロセスにアクセスできません。

代わりに、追加のパラメーターを指定して同じバッチ ファイルを実行し (この場合、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 を使用して、2 番目の 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

最後に、括弧で囲まれたコード ブロック内に複数のコマンドを配置できるため、サブルーチンが必要な理由がわかりません。また、2 レベルの FORFILES が必要な理由もわかりません。これまでに作成したコードは、単一の FORFILES で実行できるように思えます。

于 2013-12-19T01:37:21.717 に答える