2010-06-17 109 views
12

我有一個帶有宏名稱列表(每行一個)的文本文件。我的最終目標是獲取宏的名稱出現在當前目錄的文件中的次數。管道到findstr的輸入

宏的名字是C:\temp\macros.txt

type C:\temp\macros.txt在命令提示符下打印列表好。

現在我想管輸出到標準輸入findstr

type C:\temp\macros.txt | findstr *.ss (ss是我在尋找宏名稱的文件類型)。

這似乎不起作用,我沒有得到任何結果(非常快,它似乎根本沒有嘗試)。 findstr <the first row of the macro list> *.ss確實有效。

我也試過findstr *.ss < c:\temp\macros.txt沒有成功。

回答

15

我覺得你很困惑一點如何findstr的作品。它獲取輸入(查找內容 - 不是要查找的內容)作爲文件名(模式)或標準輸入,但是您要查找的內容是總是在命令行上給出的參數爲findstr

findstr foo xyz.txt 

找到文件xyz.txt在字符串foo

type meh.txt | findstr x 

發現在前面的命令的輸出字符串x(在這種情況下,文件meh.txt的內容 - 在type命令的一個很好的浪費,很多類似的cat常見誤用)。

既然你是計數而不是宏名稱出現在實際行,我會建議一種不同的方法。這是假設你的包含宏文件列出他們每行一個:

for /f "delims=" %x in (macros.txt) do @(echo %x: & find /c "%x" *.ss) 

在你的文件的內容的for循環迭代,行明智的。然後繼續輸出您正在搜索的名稱並執行find /c,這實際上會計算匹配的行數。

+1

我明白了!有沒有辦法檢查哪個參數可以從管道中取出?儘管'find'的輸出非常難看,你的最後一個命令仍然正常。謝謝! – Gauthier 2010-06-17 14:51:14

+0

那麼,你可以手動('for')對所有'* .ss'文件進行迭代並向它們拋出'find/c',解析它的輸出並自己格式化。而且,大多數情況下,程序接受的流水線輸入非常明顯,因爲該路徑通常用於從文件讀取的大量數據。我還沒有看到一個程序(PowerShell cmdlet不算),它也接受來自管道的任意參數。 – Joey 2010-06-17 15:10:35