2011-11-16 38 views
187

Ho iniziato a imparare PowerShell un paio di giorni fa, e non ho trovato nulla su google che faccia ciò di cui ho bisogno quindi per favore porta la mia domanda.Come cercare una stringa in più file e restituire i nomi dei file in PowerShell?

Mi è stato chiesto di sostituire alcune stringhe di testo in un'applicazione Jboss in esecuzione su Windows. Non conosco necessariamente l'estensione dei possibili file di destinazione e non conosco nemmeno la loro posizione. Finora sono riuscito a navigare ricorsivamente nella directory (get-ChildItem -recurse) e trovare la stringa che cercavo con get-content e selezionare-string:

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

Il problema è, posso vedere le occorrenze del testo Sto cercando, ma non so come dire a PS di restituire il percorso e il nome di ogni file corrispondente.

Come posso ottenere il nome e la posizione dei file che contengono l'espressione che sto cercando?

+0

Forse modificare la domanda per essere più generico. La risposta a questa domanda non ha nulla a che fare con JBoss o la tua applicazione su cui stai lavorando sembra ... –

risposta

289

questo dovrebbe dare la posizione dei file che contengono il vostro modello:

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name 
+1

E se vuoi anche spostare quei file? ... Sto ricevendo un errore con questo dove posso t unisciti a | Sposta-Oggetto alla fine di quello. – rud3y

+5

Move-Item non ha il parametro 'name'. Prova ad aggiungere '| % {Move-Item $ _. Name } ' –

+24

' Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path' restituisce solo la prima corrispondenza per ogni file, quindi potrebbe essere un po 'più efficiente ed evita la necessità di raggrupparli – ben

12

Tubo il contenuto del tuo

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

al fl *

Si vedrà che il percorso è già essere restituito come una proprietà degli oggetti.

se si desidera solo il percorso, utilizzare select path o select -unique path per rimuovere i duplicati:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path 
+1

Grazie a entrambi, questo è esattamente quello che sto cercando. Sfortunatamente, quando ci sono molte sottodirectory coinvolte nel percorso, PS taglia il percorso assoluto e aggiunge tre punti alla fine della riga come \ dir1 \ dir2 \ dir3 \ percorso ... quindi non so quale file viene restituito . C'è un modo per dire a PS di essere meno avido nei personaggi e preoccuparsi di mostrare il percorso completo? :) Grazie mille! – Bluz

+3

È necessario aggiungere l'opzione '-File' a' Get-ChildItem' o si finisce con una serie infinita di errori dal tentativo di chiamare 'Get-Content' nelle directory. – RubberDuck

9
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"} 

Questo vi darà i dettagli completi di tutti i file

+0

più oscuro comando mai –

5

Per mantenere i dettagli dei file completi in array risultante è possibile utilizzare una leggera modifica della risposta inviata da vikas368 (che non sembra funzionare bene con il completamento automatico ISE):

o in breve:

ls -r | ?{ $_ | Select-String -Pattern "dummy" } 
42

Ci sono una varietà di risposte precise qui, ma qui è il codice più conciso per diverse varianti. Per ogni variazione, la riga superiore mostra la sintassi completa e la parte inferiore mostra la sintassi tersa.

L'elemento (2) è una forma più concisa delle risposte di Jon Z e manojlds, mentre l'elemento (1) è equivalente alle risposte di vikas368 e buygrush.

  1. Lista FileInfo oggetti per tutti i file che contengono testo:

    Get-ChildItem -Recursefilespec| Where-Object { Select-Stringpattern$_ -Quiet } 
    ls -rfilespec| ? { slspattern$_ -q } 
    
  2. Lista nomi di file per tutti i file che contengono testo:

    Get-ChildItem -Recursefilespec| Select-Stringpattern| Select-Object -Unique Path 
    ls -rfilespec| slspattern| select -u Path 
    
  3. Lista FileInfo oggetti per tutti i file non contenente modello:

    Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) } 
    ls -rfilespec| ? { !(slspattern$_ -q) } 
    
  4. Lista nomi di file per tutti i file non contenente modello:

    (Get-ChildItem -Recursefilespec| Where-Object { !(Select-Stringpattern$_ -Quiet) }).FullName 
    (ls -rfilespec| ? { !(slspattern$_ -q) }).FullName 
    
+0

Inoltre, se siete solo in cerca di file che contengono il modello da nessuna parte, si può rinunciare dopo aver trovato la prima istanza utilizzando il parametro '-List' di [' Select-STRING'] (https://technet.microsoft.com/en-us/library/hh849903.aspx) – KyleMit

+0

Vorrei che il PO aveva chiesto una leggera variazione della domanda in modo che questa sarebbe stata la AA. # 1 è stato molto utile ed è ovvio che @ Michael Sorens groks PS! – cBlaine

2

Verrà visualizzato un elenco del percorso completo di ogni file che contiene la stringa di ricerca:

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

Si noti che non visualizza un'intestazione sopra i risultati e non visualizza le righe di testo contenenti la stringa di ricerca. Tutto ciò che ti dice è dove puoi trovare i file che contengono la stringa.

+2

Qualsiasi idea di come per visualizzare il numero di riga in cui il modello è stato trovato, insieme con il nome del file? –

5

Questo mostrerà il percorso, il nome file e la riga di contenuto trovata che corrisponde al modello.

Get-ChildItem -Path d:\applications\*config -recurse | Select-String -Pattern "dummy" 
3

Se si esegue una ricerca in una directory, si può fare:

select-string -Path "c:\temp\*.*" -Pattern "result" -List | select Path 
2

Questo è come io lo farei, non hai bisogno di Get-Content:

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

oppure

ls -r | Select-String dummy | fl 

Per vedere quale è il diverso corretto cravatte sono ...

+0

+1, questo funziona perfettamente per il mio caso, però usare 'selezionare Motivo, LineNumber, nomefile' per l'uscita più conciso. La riga restituisce TUTTO sulla riga contenente la stringa del modello. Si può anche facilmente uscita ad un csv se si desidera desiderare. – Protonova

Problemi correlati