powershell select-string con ricorsione in file specifico


2

Sono abbastanza sicuro che la stringa di selezione di Powershell funzionerà per me con un po 'di ricorsione Get-ChildItem.

Ho molte directory come questa:

abc_123
abc_345
abc_567
abc_890
abc_111
abc_569

In ogni directory, c'è un file specifico con lo stesso percorso per ciascun file in ciascuna directory:

abc_123:\AAA\SDK\Settings\foo.settings.xml
abc_345:\AAA\SDK\Settings\foo.settings.xml
abc_567:\AAA\SDK\Settings\foo.settings.xml

E così via.

All'interno del file foo.settings.xml, voglio cercare "BAR". e anche una riga sotto di essa:

  <name="BAR.ABB"
            default="1"

Il problema che sto riscontrando è nella directory che ha abc_123, abc_345, abc_567, ecc., Ci sono altre directory che contengono anche BAR. *. Non mi interessano questi risultati.

Sto tentando qualcosa del genere ma non funziona.

Get-ChildItem -Recurse *.* | Select-String -Pattern "BAR.*" foo.settings.xml | Select-Object -Unique Path

Dove nel mio comando posso specificare che voglio solo cercare le directory che iniziano con abc_ e in quel percorso specifico?

--- modificare ---

Il percorso inizia sempre abc_ * e foo.settings.xml ha sempre questo percorso: abc_*:\AAA\SDK\Settings\foo.settings.xml

Ho provato questo:, Get-ChildItem -Recurse | Where-Object {"abc_*"} | Select-String –Pattern "BAR.*"ma questo sembra dare gli stessi risultati dall'alto.

Risposte:


2

Nella tua riga Get-ChildItem -Recurse *.*stai specificando che vuoi tutti i file con qualsiasi estensione, perché *.*è vincolante per il -Filterparametro.

Per ottenere tutti i file che iniziano con il percorso abc_ * e sempre con lo stesso percorso relativo, puoi fare qualcosa del genere:Get-ChildItem -Recurse | Where-Object {$_.FullName -like 'abc_*:\AAA\SDK\Settings\foo.settings.xml'} | Select-String ...

Tuttavia, dato che ciascun file foo.settings.xml si trova nella stessa directory relativa, questo sembra relativamente inefficiente presupponendo un numero elevato di sottodirectory in ciascuna directory abc_*. Una soluzione migliore in questo caso sarebbe qualcosa del tipo:

(dove $ Path è il percorso principale della posizione con tutte le directory abc_ *)

Get-ChildItem $Path -Filter abc_* | Foreach-Object {Select-String -Path "$($_.FullName)\AAA\SDK\Settings\foo.settings.xml" -Pattern "BAR.*"}


Questo selezionerà correttamente abc * ma non cercherà in quelle directory e troverà foo.settings.xml. Il file foo è composto da tre directory sotto abc *.
Utente registrato

Allora ho frainteso. Quindi, dovrai qualificare ulteriormente il problema. Ha il percorso deve sempre cominciare con abc, o lo fa solo contiene abc da qualche parte nel nome del percorso? In entrambi i casi la risposta è fare qualcosa del genere: Get-ChildItem -Recurse | Where-Object {"filter for appropriate paths here"} | Select-String ...l'unica cosa che cambia è il "filtro per percorsi appropriati qui"
Bryan Winstead

Perché non solo guardare in modo ricorsivo attraverso le strutture di directory che corrispondono al formato desiderato? Ad esempioGet-ChildItem -Recurse abc*\AAA\SDK\Settings\*.*
radice

Il -Filterparametro di Get-ChildItemè molto limitato. Sono abbastanza sicuro che funziona solo su nomi di file, non su interi percorsi, Where-Objectandando avanti.
Bryan Winstead,

@BryanWinstead, Sì, il percorso sarà sempre abc_ * e anche il percorso foo.settings.xml è sempre lo stesso. Domanda principale modificata. Puoi mostrare un esempio con queste informazioni?
Utente registrato
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.