如何连接Windows批处理文件的命令输出

时间:2012-08-14 11:13:35

标签: windows batch-file dos

我正在编写一个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

如何连接这些输出?感谢。

2 个答案:

答案 0 :(得分: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 .
)

答案 1 :(得分: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