2016-03-14 45 views
9

Windows命令行解釋器設有一個FOR命令,這是能夠解析一個給定的命令的輸出和執行循環的輸出的每一行,例如:如何在FOR命令中指定/ D?

FOR /F %%i IN ('DIR .') DO echo %i # Outputs each file name 

命令(DIR .)被執行在通過cmd /C <command> <command-arguments>的子命令行中,但是,/D參數未指定......如果用戶具有帶輸出的AutoRun命令(例如,echo或cls),則會導致奇怪的行爲。

有沒有辦法強制FOR通過cmd /C /D <command> <command-arguments>執行命令?

+5

一個非常簡單的解決方法是使用中間文件而不是命令:DIR。 > DIR.txt'&'FOR/F %% i IN(DIR.txt)DO echo %% i' – Aacini

回答

4

您的問題非常簡單的解決方法是在命令for /F使用文件代替命令的。這樣,我們只是通過命令模擬for /F的內部操作,但是明確執行每個步驟:1.執行命令並將其輸出存儲在臨時文本文件中。 2.處理臨時文件中的所有行。 3.刪除文件。

DIR . > TempFile.txt 
FOR /F %%i IN (TempFile.txt) DO echo %%i 
DEL TempFile.txt 
+2

非常好的主意,並且易於實施。 – dbenham

6

你已經遇到了cmd.exe的許多設計缺陷之一,而且這個問題困擾了我很長一段時間。我很確定,當FOR/F執行命令時,沒有辦法抑制AutoRun。

是什麼讓這個特別令人惱火的是,管道也使用CMD/C(管道的每一邊都有一個),但是管道的設計者非常聰明,可以同時包含/ D和/ S選項。 FOR/F的設計師不可能做到這一點真是令人慚愧。

我相信你唯一的追求 一個選擇是在你的AutoRun命令定義中防守。我建議把所有的自動運行具有類似頂部以下批處理腳本內命令:

@echo off 
if defined AutoRunComplete exit /b 
set AutoRunComplete=1 
REM Put your AutoRun commands below... 

但如果你無法控制的自動運行命令,然後 我覺得你的運氣了。 Aacini's idea of using a temporary file to get around the problem是一個有效且簡單的解決方案。

+0

感謝您的評論 - 不幸的是,我無法控制AutoRun文件,問題發生在客戶站點,我們我們希望確保我們不能再次遇到同樣的情況。您是否偶然知道任何討論此問題的MS Connect問題? –

+3

@ D.R。 - 我能找到的最好的是https://blogs.msdn.microsoft。com/oldnewthing/20071121-00 /?p = 24433 – dbenham

2

當您有許多FOR/F塊來解析程序輸出時,那麼添加一個cmd.exe包裝可能會很有用。

此包裝可以安裝

set "comspec=C:\somewhere\cmdWrapper.exe" 
FOR /F %%i IN ('DIR .') DO echo %%i 

本身與/D /C啓動原來的cmd.exe的包裝。

但是comspec variable本身的行爲有點奇怪。

+0

另一個有趣的想法。我想你可以用CSCRIPT實現包裝。但是,cmd FOR/F緩存COMSPEC值的「奇怪」行爲使得該技術不可靠。我看不出如何控制腳本是否是使用FOR/F的第一個腳本。 – dbenham

+0

我已經嘗試過CSRIPT,但是因爲它不接受'/ C'選項而失敗。目前我正在使用mshta的'.hta'文件,但我無法使它工作,因爲它似乎只有.exe對於'comspec'有效,但不是文件關聯 – jeb