2014-12-03 61 views
0

什麼是正確的方法?或者,有沒有一個正確的方法?批次FOR循環類型與沒有類型

我們看到: http://www.robvanderwoude.com/files/sharemig_nt.txt作爲一個例子..

:: Read the list of shares to be migrated and generate the required batch files 
FOR /F "skip=4 tokens=1" %%A IN ('TYPE "%~dp0%ComputerName%_netshares.txt" 2^>NUL ^| FINDSTR.EXE /R /B /I /V /C:"The command completed successfully\." ^| FINDSTR.EXE /R /B /V /C:" " ^| SORT') DO CALL :ReadShare %%A 

還成功地應用於:

SET servers=%CD%\monitored_computers.txt 
FOR /F "tokens=1-2* delims=," %%A IN (%servers%) DO (
    SET SERVERNAME=%%A 
    SET IP=%%B 
) 

有沒有理由使用TYPE與 「流」 的內容文本文件?

具體做法是:

IN ('TYPE "%~dp0%ComputerName%_netshares.txt"... 

而且,是的,我明白,類型,類型或什麼* NIX世界將CAT或連接文件的內容到屏幕或重新定向到另一個文件作進一步處理。 。

對戰

IN (%servers%) DO... 

還幾乎做同樣的事情。對?

謝謝!

+0

在第一個示例中,您解析的是第二個文件中命令的輸出。這顯然是一個根本的區別。 – ths 2014-12-03 18:21:43

回答

1

非常多。

我相信你會發現,但如果沒有換行符終止文件,TYPE會方便地爲你添加一個。

+0

這對處理以* NIX或* NIX編碼生成的文件尤其有幫助。過去幾天我已多次閱讀過這些內容。很好的回答! – Leptonator 2014-12-03 16:26:46

0

我想我已經回答了我的問題:

如果執行以下操作:

SET settings=D:\tomcat\conf\server.xml 
FOR /F %%A IN ('%settings% ^| find "<Connector port="') DO (
echo %%A 
) 

pause 

當從服務器上運行,它會打開Internet Explorer中的XML文件。當然,這是不正確的。

對戰:

SET settings=D:\tomcat\conf\server.xml 
FOR /F %%A IN ('TYPE %settings% 2^> ^| find "<Connector port="') DO (
echo %%A 
) 

pause 

這一個產生的結果。

因此,在這個例子中,您需要通過設置文件TYPE或pipe來搜索您需要的結果,而不是查看系統列表。這實際上取決於你需要做什麼來處理你需要解析的列表。

謝謝!

+0

注意'FOR/F %% A IN('%settings%^ | find「 Aacini 2014-12-03 18:51:55

1

for /F "options..." %%a in (fileName.txt) do ... 

for /F "options..." %%a in ('type fileName.txt') do ... 

之間的根本區別在第一種情況下,「FILENAME.TXT」是FOR命令打開,只是從中讀取它的行。在第二種情況下,FOR命令啓動一個新的內部cmd.exe會話,向其傳遞「type fileName.txt」命令,將cmd.exe輸出重定向到臨時文件,從該重定向文件讀取其行,最後臨時文件被刪除。如果這個FOR命令被放置在另一個執行它的內部,那麼經過時間的差異可能會出乎意料!

當FOR/F命令的附加功能不是必需的(「標記,分隔等」)時,使用它而不是基本功能或純FOR命令會浪費資源。例如:

for %%a in (*.txt) do ... 

for /F "delims=" %%a in ('dir /B *.txt') do ... 

以前的情況相同意見適用於此:第一個爲自身獲取的文件名,但第二個需要另一個CMD.EXE會話。當然,如果現在使用這些命令,使用哪一個並不重要;問題是人們開始使用從效率的觀點最糟糕的方法,因爲是他們以前使用的方法來寫大批量程序的時候...當

for /F "options..." %%a in ('type fileName.txt ^| find "etc"') do ... 

來代替

另一個類似的問題發生的

for /F "options..." %%a in ('find "etc" ^< fileName.txt') do ... 

因爲重定向以更有效的方式比管道,需要對管道的各側的附加的cmd.exe會話中執行!