2017-06-02 31 views
0

我有我的CLI查詢設定後只返回了一切:Windows的命令行使用FINDSTR字符串

c:\>findstr /c:"TOTAL" Invoice.txt 
TOTAL 80:00 

但是我只希望搜索查詢,查詢後返回的一切:

80.00 

另外,如果我在文件名中使用wild,它會返回整個文件名,然後返回該行。我想再次只返回字符串後面的所有內容,而不是文件名,因爲我想將結果傳送到文本文件中。

c:\>findstr /c:"TOTAL" *.txt 
Invoice - Copy (2).txt:TOTAL 120.00 
Invoice - Copy (3).txt:TOTAL 110.00 
Invoice - Copy (4).txt:TOTAL 100.00 
Invoice - Copy.txt:TOTAL 90.00 
Invoice.txt:TOTAL 80.00 

理想我跑我的命令,並且只獲得關於如何做到這一點下面

120.00 
110.00 
100.00 
90.00 
80.00 

想法? Powershell或CMD很好。目前我將把它全部放到批處理腳本中,但是ps腳本可以工作。

謝謝!

回答

0

爲了得到一個命令的輸出,使用for /f循環:

for /f "tokens=2" %%a in ('findstr /c:"TOTAL" *.txt') do echo %%a 

考慮,您的數據始終是你的榜樣(行正是TOTAL xxx.xx並沒有在文件中沒有其他TOTAL(可能要使用findstr /b))

(分批語法。爲了直接在命令行使用它,替換每%%a%a

編輯有點複雜,文件名中有空格。做它在兩個步驟:首先獲得由:"tokens=2 delims=:" %%a)純數據分割和由空間(標準分隔符)第二for分裂("tokens=2" %%b):

for /f "tokens=2 delims=:" %%a in ('findstr "TOTAL" *.txt') do (
    for /f "tokens=2" %%b in ("%%a") do echo %%b 
) 

(更多的代碼,但比搞亂更好與原始數據(重命名文件))

+0

接近但不是完全沒有,我只好先刪除空格 https://stackoverflow.com/questions/11270453/how-to-remove-spaces-from-file-names-in -bulk 在文件名中,然後你的for/f循環工作。 –

+0

對不起,我錯過了文件名中的空格。請參閱我的編輯。 – Stephan

0

A for /F loop可以捕獲findstr命令行的輸出。具有存儲在環境變量中每行後,sub-string replacement可以在某種程度上被應用於一切至多且包括: + TOTAL + SPACE變得移除:

setlocal EnableDelayedExpansion 
for /F "delims=" %%L in ('findstr /C:"TOTAL" "*.txt"') do (
    set "LINE=%%L" 
    echo(!LINE:*:TOTAL =! 
) 
endlocal 
0

只是我的2美分;-)。第一個for可以是一個簡單的迭代文件名。

@Echo off 
(For %%A in (*.txt 
) Do For /f "tokens=2" %%B in ('findstr /B /C:"TOTAL" "%%A"' 
) Do Echo:%%B 
) >All-Totals.txt 
0

在PowerShell中也很容易。

PS C:\src\t> Get-Content .\Invoice.txt | Where-Object { $_ -match '.*TOTAL (.*)' } | % { $matches[1] } 
120.00 
110.00 
100.00 
90.00 
80.00 

PS C:\src\t> cat .\Invoice.txt | where { $_ -match '.*TOTAL (.*)' } | % { $matches[1] } 
120.00 
110.00 
100.00 
90.00 
80.00