我正在编写一个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
如何连接这些输出?感谢。
答案 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
。