您已經使用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