3

90 日以上経過したログを消去する Windows バッチ ファイルを作成しています。コマンドの出力を連結して 1 行に表示するにはどうすればよいですか? また、この出力を後でファイルに追加したいと考えています。これまでの私のバッチファイルは次のとおりです。

@echo off    
time /t && echo "--" && date /t && echo " -I- Purging " && FORFILES /P "D:\Logs" /M *.log /D -90 /C "cmd /c echo @file @fdate"
rem FORFILES that will purge the files

そしてこれは出力します:

12:08
--
14/08/2012
 -I- Purging

"<filename>" 02/08/2012
"<filename>" 30/07/2012

これらの出力を連結するにはどうすればよいですか? ありがとう。

4

2 に答える 2

4

FOR 出力以外のすべてを 1 行に入れるのは簡単です。TIME および DATE コマンドの代わりに、動的な %TIME% および %DATE% 変数を使用する必要があります。

@echo off    
echo %time% "--" %date% -I- Purging 
FORFILES /P "D:\Logs" /M *.log /D -90 /C "cmd /c echo @file @fdate"
rem FORFILES that will purge the files

ファイル名も同じ行に表示する場合は、EitanT が提案したように一時変数を使用できます。ただし、これにより、最大 8191 変数サイズに収まるファイル数に制限されます。無制限の数のファイルを処理するには、代わりに SET /P を使用できます。FOR /F ステートメントが必要なようには見えませんが、それなしでは解決できない引用の問題があります。

@echo off
<nul (
  set/p="%time% -- %date% -I- Purging "
  for /f "delims=" %%A in (
    'FORFILES /P "D:\Logs" /M *.log /D -90 /C "cmd /c echo @file @fdate"'
  ) do set/p="%%A "
)
rem FORFILES that will purge the files

ファイルを一覧表示すると同時にファイルをパージしない理由はありません。FORFILES は非常に遅いため、同じコマンドで削除と一覧表示を行う方がはるかに効率的です。

@echo off
<nul (
  set/p="%time% -- %date% -I- Purging "
  for /f "delims=" %%A in (
    'FORFILES /P "D:\Logs" /M *.log /D -90 /C "cmd /c del @path&echo @file @fdate"'
  ) do set/p="%%A "
)


2015-01-06 更新

FOR /Fを使用せずに解決策を見つけました。0x22 を使用して SET /P プロンプトを引用符で囲み、FINDSTR を使用して、要求された出力の前に FORFILES が書き込む空の行を削除します。

@echo off
<nul (
  set/p="%time% -- %date% -I- Purging "
  forfiles /p "d:\logs" /m *.log /d -90 /c "cmd /c del @path&set/p=0x5e0x22@file @fdate 0x5e0x22"'|findstr .
)
于 2012-08-14T14:13:03.980 に答える
1

出力の行を連結する場合はCMD_STR、目的のコマンドに設定して、次for /fのようにループを使用できます。

@echo off
setlocal enabledelayedexpansion
set "CMD_STR=time /t && echo "--" && date /t && echo " -I- Purging " && FORFILES /P "D:\Logs" /M *.log /D -90 /C "cmd /c echo @file @fdate""
set CONCAT_STR=
for /f %%i in ('%CMD_STR%') do set "CONCAT_STR=!CONCAT_STR! %%i"
echo !CONCAT_STR!

ループは出力の行を繰り返し、それらを1つずつに追加しますCONCAT_STR

于 2012-08-14T12:21:27.207 に答える