Wiersz poleceń systemu Windows - wyjście potoku operacji wyszukiwania katalogu do operacji (obcinania)

2

To jest Windows 10. Pytanie jest bardzo proste, po prostu nie znam odpowiedniej składni, aby to zrobić.

Spowoduje to wyświetlenie wszystkich plików z rozszerzeniem .log:

dir /s /p *.log

Spowoduje to obcięcie pliku:

echo|set /p=>"myfile.log"

To, co chciałbym zrobić, to przesłać dane wyjściowe pierwszej operacji do drugiej operacji, tym samym obcinając pasujące pliki zwrócone przez dir. Jak mam to zrobić?

Oliver Williams
źródło
Czy chcesz wyczyścić każdy dziennik w katalogu z wszelkich danych wejściowych?
Seth
Tak, Seth to prawda.
Oliver Williams

Odpowiedzi:

1

Rurociągi do normalnego cmd nie są tak powszechne w systemie Windows. Więc dla cmd prawdopodobnie będziesz musiał uzyskać listę tych plików w zmiennej i użyć pętli for do ich przetworzenia. Być może możesz również bezpośrednio użyć dirpolecenia w pętli.

Wybrałbym PowerShell, który działa podobnie, ale moim zdaniem jest bardziej czytelny:

Get-ChildItem -Recurse -Filter "*.log" | Clear-Content

Jeśli chcesz potwierdzić każdy pojedynczy plik ( /Pna twoim dirwstrzymuje każdy ekran), możesz użyć -Confirmwłącznika Clear-Content.

Jeśli chcesz użyć pętli for z dowolnego powodu i użyć echa, którego możesz użyć:

Get-ChildItem -Recurse -Filter "*.log" | %{ echo $null > $_; }
Seth
źródło
Zajrzę do PowerShell. Być może link do tego dla przyszłych widzów tego postu. Dzięki.
Oliver Williams,
Próbowałem tego i z powodzeniem dodałem -Recurse i -Filter exactfilename.log, jednak PowerShell nie lubi znaku *
Oliver Williams
Co masz na myśli, że nie lubi gwiazdki? Umieściłeś to w cytatach?
Seth
0

Aby po prostu zebrać dane wyjściowe katalogu w pliku dziennika, upuść / p i przekieruj katalog / s * .log> mój_plik.log

Spowoduje to utworzenie nowego pliku, usuwając wszystkie poprzednie treści.

Jeśli chcesz uzyskać pełną ścieżkę w każdej linii, zamiast listowania według podkatalogów, użyj / b katalog / s / b * .log> mój_plik.log

Leo Blackman
źródło
Leo, nie tego chcę robić. Chcę obciąć pliki dirzwracane do 0 bajtów - nie zapisywać niczego na myfile.log. Nie ma pliku myfile.log - to tylko przykład. Edytowałem mój post, aby to wyjaśnić.
Oliver Williams
0

Jak obciąć pasujące pliki zwrócone przez dir /s /p *.log?

Użyj następującego pliku wsadowego (test.cmd):

@echo off
setlocal
for /f "tokens=*" %%f in ('dir /b /s *.log') do (
  echo|set /p=>"%%f"
  )
endlocal

Przykładowe użycie:

> dir /s /p *.log
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

02/10/2016  17:02             2,305 test.log
               1 File(s)          2,305 bytes

 Directory of F:\test\test

02/10/2016  17:02             2,305 test.log
               1 File(s)          2,305 bytes

 Directory of F:\test\test with space

02/10/2016  17:02             2,305 test.log
               1 File(s)          2,305 bytes

     Total Files Listed:
               3 File(s)          6,915 bytes
               0 Dir(s)  1,737,619,595,264 bytes free

> test

> dir /s /p *.log
 Volume in drive F is Expansion
 Volume Serial Number is 3656-BB63

 Directory of F:\test

24/11/2016  10:39                 0 test.log
               1 File(s)              0 bytes

 Directory of F:\test\test

24/11/2016  10:39                 0 test.log
               1 File(s)              0 bytes

 Directory of F:\test\test with space

24/11/2016  10:39                 0 test.log
               1 File(s)              0 bytes

     Total Files Listed:
               3 File(s)              0 bytes
               0 Dir(s)  1,737,619,607,552 bytes free

Dalsza lektura

DavidPostill
źródło