2011-08-08 91 views
28

是否可以在批處理文件中使用管道標準輸入流?在批處理文件中讀取標準輸入流

我希望能夠以一個命令的輸出重定向到我的批處理文件process.bat列表,以便:

C:\>someOtherProgram.exe | process.bat 

我第一次嘗試看起來像:

echo OFF 
setlocal 

:again 
set /p inputLine="" 
echo.%inputLine% 
if not (%inputLine%)==() goto again 

endlocal 
:End 

當我與type testFile.txt | process.bat測試它會重複打印出第一行。

還有別的辦法嗎?

+2

偉大的問題,很好的答案,真的搞砸了,沒有更好的答案! –

回答

31

set /p不適用於管道,它需要輸入中的一行(隨機)。
但是你可以在for循環中使用more

@echo off 
setlocal 
for /F "tokens=*" %%a in ('more') do (
    echo #%%a 
) 

但這失敗,以分號開頭的行(如EOL的FOR-LOOP-標準是;)。
它不能讀取空行。
但是對於findstr,你也可以解決這個問題,它在每行的前面加上細線編號,所以你永遠不會看到空行。
然後將前綴移除到第一個冒號。

@echo off 
setlocal DisableDelayedExpansion 

for /F "tokens=*" %%a in ('findstr /n $') do (
    set "line=%%a" 
    setlocal EnableDelayedExpansion 
    set "line=!line:*:=!" 
    echo(!line! 
    endlocal 
) 

另外,在不包括findstr某些環境(WinRE的一樣),用find.exe另一種可能足夠了。 find將接受空搜索字符串"",並允許搜索反轉。這將允許這樣的事情:

@echo off 
setlocal DisableDelayedExpansion 

for /F "tokens=*" %%a in ('find /v ""') do (
    set "line=%%a" 
    echo(!line! 
) 
+1

這似乎工作。我以前沒有看過'set「line =!line:*:=!」'語法。更多批處理腳本瘋狂。我稍微調整了它以使用MSYS工具; 'sed「s/^ \(。* \)$/\」\ 1 \「/」''而不是'findstr/n $'。然後,可以用'echo。%%〜a'替換主體,並且它可以處理非DOS行結束(我擁有大量文件)。 – m0tive

+5

最好使用'FINDSTR/N「^」'。該搜索將正確返回所有行,包括unix格式化行以及任何可能不以換行符結束的最終行。 – dbenham

+0

我認爲你可以使用'for/F'tokens = * eol =「'來處理以分號開頭的行。 – wangzq

3

集 「line=!line:*:=!」 語法是:

  1. 集需要一個參數是a=b
    如果a包含空格或其他內容,則必須在此參數周圍使用引號。在這裏,我沒有看到任何

  2. !line:*:=!
    對於此語法,您可以鍵入「set /?」看到使用變量正式說明。
    !var!就像%var%,以獲得價值。但!var!意味着延遲擴展

線變種名稱

第一:可變修飾標記。

**:= **:=(空),替換變量的值匹配「*:」字符串(幾乎從字符串開始第一: occurence)與(空),即刪除從開始的子到第一結腸。

1
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
    > CON ECHO.%%B 
    >> %File% ECHO.%%B 
) 

這裏來源:http://www.robvanderwoude.com/unixports.php#TEE

+0

這在以分號開頭的行上也不會失敗。 – Ben

+0

但是對於我來說,它在以']開始的行上失敗了。 –

1

另外,在不包括findstr某些環境(WinRE的一樣),用find.exe另一種可能足夠了。 find將接受空搜索字符串"",並允許搜索反轉。這將允許這樣的事情:

@echo off 
setlocal DisableDelayedExpansion 

for /F "tokens=*" %%a in ('find /v ""') do (
    set "line=%%a" 
    echo(!line! 
)