2016-06-11 32 views
8

mam pliki txt, które zawierają kilka wierszy i muszę utworzyć dziennik z nich przechowywać w dzienniku następujące informacje:
Nazwa pliku
Ostatnia modyfikacja
Hrabiego wierszy zawierających wyraz "valid"Nie można powtórzyć w tej samej linii w skrypcie

Połączyłem plik .bat, ale dzieli on dane wyjściowe w dwóch wierszach.

type nul > FilesReceived.txt & for %f in (*.log) do (
find /c "valid" %f & echo(%~tf)>> LogsReceived.txt 
) 

W typie nul wyczyściam zawartość pliku FilesReceived.txt. Następnie przeglądam pliki typu log.
Następnie liczę wiersze zawierające słowo valid z find/c, a także echo ostatniej modyfikacji znacznika czasu.

Jednak wyjście wygląda następująco:

---------- transaction_20160505_1005A.log: 6492
06.10.2016 04:37 po południu

Nie wiem, co generuje te kreski. Ostatecznie chciałbym mieć jeden wiersz na plik dziennika w następujący sposób:

transaction_20012B.log: 6492 10/06/2016 04:37 pm

Mam nadzieję, że możesz mi pomóc.

Dzięki,

Bruce

+4

życzę więcej użytkowników pisał pierwsze pytania, takie jak ten. :-) –

Odpowiedz

2

find drukuje kreski jeśli przetwarza plik. Nie jest to, gdy przetwarzanie ze STDIN (type file.ext /c |find "string" drukuje tylko liczbę).

Jest trik pisać bez wysuw wiersza: <nul set /p"=Hello"

Jeśli można żyć z innym celu, to jest dość łatwe do zmontowania ::

@echo off 
for %%f in (*.bat) do (
    <nul set /p "=%%f %%~tf " 
    type %%f|find /c "echo" 
) 

Jeśli chcesz zachować swoje zamówienie to trochę bardziej skomplikowana: nie można zmusić find pisać bez wysuw wiersza, więc trzeba użyć trick (inny for):

@echo off 
(for %%f in (*.txt) do (
    <nul set /p "=%%f: " 
    for /f %%i in ('type %%f^|find /c "valid"') do (<nul set /p "=%%i ") 
    echo %%~tf 
))>LogsReceived.txt 
+0

Zamiast orurowania, użyłbym przekierowania jak '<" file.ext "find/C" string "' ze względu na wydajność, więc nie ma potrzeby "typu" tutaj ... – aschipfl

1

Można uzyskać dane wyjściowe polecenia find za pośrednictwem innego for i umieścić go w dowolnym miejscu chcesz:

@echo off 

(for %%f in (*.log) do (
    for /F %%c in ('find /c "valid" ^< %%f') do echo %%f: %%c %%~tf 
)) > LogsReceived.txt 
Powiązane problemy