Zacząłem uczyć się PowerShell kilka dni temu i nie mogłem znaleźć w Google niczego, co robi to, czego potrzebuję, więc proszę o odpowiedź na moje pytanie.
Poproszono mnie o zamianę niektórych ciągów tekstowych na wiele plików. Niekoniecznie znam rozszerzenie możliwych plików docelowych i nie znam ich lokalizacji. Do tej pory udało mi się rekursywnie przeglądać katalog ( get-ChildItem -recurse
) i znaleźć szukany ciąg za pomocą get-content i select-string:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
Problem polega na tym, że widzę wystąpienia tekstu, którego szukam, ale nie wiem, jak powiedzieć PS, aby zwrócił ścieżkę i nazwę dla każdego pasującego pliku.
Jak mogę uzyskać nazwę i lokalizację plików zawierających szukane wyrażenie?
Odpowiedzi:
To powinno podać lokalizację plików, które zawierają twój wzorzec:
źródło
name
parametru. Spróbuj dodać| %{Move-Item $_.name <destination>}
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path
zwraca tylko pierwsze dopasowanie dla każdego pliku, więc może być nieco bardziej wydajne i pozwala uniknąć konieczności ich grupowaniatxt
plików, jeśli używaszGet-ChildItem -Recurse -Filter *.txt
zamiastforeach
pętli, jeśli wykonujesz takie duże operacje. Staje się bardzo skomplikowany, gdy próbujesz zrobić to wszystko w jednym wierszu i bardzo łatwo jest popełnić duży błąd. Mówię z doświadczeniaIstnieje wiele dokładnych odpowiedzi tutaj, ale tutaj jest najbardziej zwięzły kod dla kilku różnych odmian. Dla każdej odmiany górny wiersz pokazuje pełną składnię, a dolny pokazuje zwięzłą składnię.
Pozycja (2) jest bardziej zwięzłą formą odpowiedzi Jona Z i manojldsa, podczas gdy pozycja (1) odpowiada odpowiedziom od vikas368 i buygrush.
Wyświetl obiekty FileInfo dla wszystkich plików zawierających wzorzec:
Wyświetl nazwy plików dla wszystkich plików zawierających wzorzec:
Lista FileInfo obiektów dla wszystkich plików nie zawierających wzór:
Lista nazw plików dla wszystkich plików nie zawierających wzór:
źródło
-List
parametruSelect-String
Spowoduje to wyświetlenie ścieżki, nazwy pliku i znalezionej linii treści pasującej do wzorca.
źródło
Potokuj zawartość swojego
do
fl *
Zobaczysz, że ścieżka jest już zwracana jako właściwość obiektów.
JEŚLI chcesz tylko ścieżki, użyj
select path
lub,select -unique path
aby usunąć duplikaty:źródło
-File
przełącznikGet-ChildItem
lub skończyć z niekończącą się kaskadą błędów podczas próby wywołaniaGet-Content
katalogów.(Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullName
Ludzie zapominają, że PowerShell jest zorientowany obiektowo; w razie wątpliwości poszukaj nieruchomościTak bym to zrobił, nie potrzebujesz treści:
lub
Aby zobaczyć, jakie są różne właściwości ...
To jest szybsze. Drugi argument to -filter:
źródło
select Pattern, LineNumber, Filename
dla bardziej zwięzłego wydruku. Linia zwraca WSZYSTKO w wierszu zawierającym ciąg wzorca. Możesz również łatwo wyprowadzić to do pliku csv, jeśli chcesz.To da ci pełne szczegóły wszystkich plików
źródło
-r
działa. Pomyślałem, że zawsze musisz to robić-Recurse
Aby zachować pełne szczegóły pliku w wynikowej tablicy, możesz użyć niewielkiej modyfikacji odpowiedzi opublikowanej przez vikas368 (która nie działała dobrze z autouzupełnianiem ISE):
lub w skrócie:
źródło
Jeśli przeszukujesz jeden katalog, możesz to zrobić:
źródło
Spowoduje to wyświetlenie listy pełnej ścieżki do każdego pliku zawierającego ciąg wyszukiwania:
Zauważ, że nie wyświetla nagłówka nad wynikami i nie wyświetla wierszy tekstu zawierających szukany ciąg. Wszystko, co mówi, to miejsce, w którym można znaleźć pliki zawierające ciąg.
źródło
Zmodyfikowałem jedną z powyższych odpowiedzi, aby uzyskać trochę więcej informacji. To oszczędzało mi później drugiego zapytania. To było coś takiego:
Mogę określić ścieżkę i symbole wieloznaczne pliku za pomocą tych struktur i zapisuje nazwę pliku, numer linii i odpowiednią linię do pliku wyjściowego.
źródło