3

我正在编写一个 Windows 批处理文件,它将清除超过 90 天的日志。如何连接命令的输出以使它们出现在一行中?我还想稍后将此输出附加到文件中。到目前为止,我的批处理文件是:

@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 输出之外的所有内容放在一行上很容易。您只需要使用动态 %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!

循环遍历输出的行并将它们一一追加到CONCAT_STR.

于 2012-08-14T12:21:27.207 回答