批处理脚本中无法在同一行中使用echo命令输出

8

我有一些包含多行文本的txt文件,我需要创建一个日志来存储以下信息:
文件名
最后修改时间
包含单词“valid”的行数

我已经编写了一个.bat文件,但它将输出分成了两行。

type nul >  FilesReceived.txt & for %f in (*.log) do (
find /c "valid" %f & echo(%~tf)>> LogsReceived.txt
)

使用type nul命令清空FilesReceived.txt文件的内容。然后循环遍历log类型的文件。使用find /c命令计算包含单词“valid”的行数,并输出最后修改时间戳。但是输出结果包含了横线,不知道是哪里生成的。最终希望每个日志文件只有一行输出,格式如下:transaction_20012B.log: 6492 10/06/2016 04:37 p.m. 希望能得到帮助,谢谢。 - Bruce

4
我希望更多用户发布像这样的第一个问题。 :-) - Ken White
2个回答

2

find 命令在处理文件时会打印破折号,但在处理 STDIN 时不会(type file.ext /c |find "string" 只会打印计数)。

有一个技巧可以不换行输出:<nul set /p"=Hello"

如果你可以接受其他的顺序,那么组装它就很容易:

@echo off
for %%f in (*.bat) do (
  <nul set /p "=%%f %%~tf "
  type %%f|find /c "echo"
)

如果您想保留订单,那就有点复杂了:您无法强制find不换行写入,因此您需要使用一个技巧(另一个for):

@echo off
(for %%f in (*.txt) do (
  <nul set /p "=%%f: "
  for /f %%i in ('type %%f^|find /c "valid"') do (<nul set /p "=%%i ")
  echo %%~tf
))>LogsReceived.txt

出于性能方面的考虑,我会使用重定向而不是管道,例如 < "file.ext" find /C "string",所以这里不需要 type - aschipfl

1
你可以通过另一个 for 获取 find 命令的输出,并将其放置在任何你想要的地方:
@echo off

(for %%f in (*.log) do (
   for /F %%c in ('find /c "valid" ^< %%f') do echo %%f: %%c %%~tf
)) > LogsReceived.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接