您已经使用FOR/F来捕获DIR命令的输出。捕捉FINDSTR的输出是没有什么不同。
但是,使用简单的FOR代替DIR命令的FOR/F会更高效。
您使用%~f1
当我想你打算%%~fg
。
您不能使用%var%扩展括号内的变量集,您必须使用!var!反而延迟扩展。在命令行中键入SET /?
了解更多信息 - 阅读开始节“最后,对于延迟的环境变量扩展支持已经 添加...”
然而,在你的情况,你可以很容易地避免使用延迟扩展(不是它是一个问题)。
而不是删除任何现有的“fullnames.txt”,然后将输出附加到它,更有效的方法是将整个结构放在括号内,并使用over-write模式将所有输出重定向到文件。
@echo off
(
for %%F in (*.eml) do (
for "delims=" %%A in ('findstr /b /c:"To: " "%%F"') do echo %%F %%A
)
) >fullnames.txt
但是,上面的解决方案虽然简单,但它比需要的复杂得多。
FINDSTR可以处理使用通配符指定的多个文件,并且它会将每个匹配行与文件名后跟一个冒号前缀。
您可以通过命令行让你的结果只是甚至没有使用批处理文件(或者你可以把这个批处理文件):
findstr /b /c:"To: " *.eml >fullnames.txt
编辑
如果您关注的是,文件可能包含多行开始“为:”,你只需要使用的第一行,那么就回使用批处理文件:
@echo off
setlocal enableDelayedExpansion
set "prevFile="
(
for /f "tokens=1* delims=:" %%A in ('findstr /b /c:"To: " *.eml') do (
if "%%A" neq "!prevFile!" echo %%A: %%B
set "prevFile=%%A"
)
) >fullnames.txt
上述解决方案可以˚F如果文件名包含!
。此外,只要路径不包含驱动器号,路径可以与*.eml
一起使用。驱动器和!
问题都可以通过其他修改来解决。
但是'设置toline = FINDSTR/B/C“为:”'不会_execute_了' FINDSTR'命令,它仅分配文本 – jeb 2012-03-17 06:05:19