Jak przeszukiwać ciąg znaków w wielu plikach i zwracać nazwy plików w Powershell?

Zacząłem uczyć się powershell kilka dni temu, i nie mogłem znaleźć nic w google, które robi to, czego potrzebuję, więc proszę o moje pytanie.

Zostałem poproszony 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ę rekurencyjnie przeglądać katalog (get-ChildItem -recurse) i znaleźć szukany ciąg znaków z get-content I select-string:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

Problem polega na tym, że widzę występowanie tekstu, którego szukam, ale nie wiem, jak powiedzieć psowi, aby zwrócił ścieżkę i nazwę dla każdego pasującego pliku.

Jak mogę uzyskać nazwę i lokalizację plików zawierających wyrażenie, którego szukam?

Author: Bluz, 2011-11-16

9 answers

To powinno podać lokalizację plików zawierających Twój wzorzec:

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
 339
Author: jon Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 15:08:33

Istnieje wiele dokładnych odpowiedzi tutaj, ale tutaj jest najbardziej zwięzły kod dla kilku różnych odmian. Dla każdej odmiany górna linia pokazuje pełną składnię, a dolna-składnię skróconą.

Pozycja (2) jest bardziej zwięzłą formą odpowiedzi od Jona z i manojldsa, podczas gdy pozycja (1) jest równoważna odpowiedziom od vikas368 i buygrusha.

  1. Lista fileinfo obiektów dla wszystkich plików zawierających wzorzec:

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
  2. Lista nazwy plików dla wszystkich plików zawierających wzorzec:

    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
  3. Lista FileInfo obiektów dla wszystkich plików nie zawierających wzorzec:

    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
  4. Lista nazw plików dla wszystkich plików nie zawierających wzorzec:

    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
    
 52
Author: Michael Sorens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-17 12:38:40

Pokaż zawartość swojego

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

Do fl *

Zobaczysz, że ścieżka jest już zwracana jako właściwość obiektów.

Jeśli chcesz tylko ścieżkę, użyj select path lub select -unique path, Aby usunąć duplikaty:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path
 15
Author: manojlds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 16:20:51
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

To da ci pełne informacje o wszystkich plikach

 9
Author: vikas368,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-22 13:13:38

Wyświetli ścieżkę, nazwę pliku i znalezioną linię zawartości pasującą do wzorca.

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 
 7
Author: user5000502,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-11 18:41:09

Aby zachować pełne szczegóły pliku w tablicy wynikowej, możesz użyć niewielkiej modyfikacji odpowiedzi wysłanej przez vikas368 (która nie działała dobrze z autouzupełnianiem ISE):

Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }

Lub w skrócie:

ls -r | ?{ $_ | Select-String -Pattern "dummy" }
 5
Author: buygrush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-21 10:12:12

Tak bym to zrobił, nie potrzebujesz get-content:

ls -r | Select-String dummy | select line,path

Lub

ls -r | Select-String dummy | fl

Aby zobaczyć, jakie są różne właściwości...

 5
Author: js2010,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-05 17:34:36

Wyświetli listę pełnej ścieżki do każdego pliku zawierającego szukany ciąg:

foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}

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 gdzie można znaleźć pliki, które zawierają ciąg znaków.

 3
Author: Little Girl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-07 18:48:17

Jeśli przeszukasz jeden katalog, możesz to zrobić:

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path
 3
Author: Esperento57,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-05 11:00:13