Powershell-Auswahlzeichenfolge mit Rekursion in eine bestimmte Datei

966
Registered User

Ich bin mir ziemlich sicher, dass Powershells select-string für mich mit ein bisschen Rekursion von Get-ChildItem funktionieren wird.

Ich habe viele Verzeichnisse wie folgt:

abc_123 abc_345 abc_567 abc_890 abc_111 abc_569 

In jedem Verzeichnis gibt es eine bestimmte Datei mit demselben Pfad zu jeder Datei in jedem Verzeichnis:

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

Und so weiter.

Ich möchte in der Datei foo.settings.xml nach "BAR" suchen. und auch eine Zeile darunter:

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

Das Problem, das ich habe, befindet sich in dem Verzeichnis, das abc_123, abc_345, abc_567 usw. hat, es gibt andere Verzeichnisse, die auch BAR. * Enthalten. Ich interessiere mich nicht für diese Ergebnisse.

Ich versuche so etwas, aber es funktioniert nicht.

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

Wo kann ich in meinem Befehl angeben, dass ich nur Verzeichnisse durchsuchen möchte, die mit abc_ beginnen und an diesem bestimmten Pfad beginnen?

--- bearbeiten ---

Der Pfad beginnt immer mit abc_ * und foo.settings.xml hat immer diesen Pfad: abc_*:\AAA\SDK\Settings\foo.settings.xml

Ich habe dies versucht:, Get-ChildItem -Recurse | Where-Object {"abc_*"} | Select-String –Pattern "BAR.*"aber dies scheint die gleichen Ergebnisse von oben zu ergeben.

3

1 Antwort auf die Frage

2
Bryan Winstead

In Ihrer Zeile geben Get-ChildItem -Recurse *.*Sie an, dass Sie alle Dateien mit einer beliebigen Erweiterung wünschen, da *.*sie an den -FilterParameter gebunden sind .

Um alle Dateien beginnend mit Pfad abc_ * und immer mit der gleichen relativen Pfad, den Sie so etwas tun kann:Get-ChildItem -Recurse | Where-Object {$_.FullName -like 'abc_*:\AAA\SDK\Settings\foo.settings.xml'} | Select-String ...

Da sich jedoch jede Datei foo.settings.xml im selben relativen Verzeichnis befindet, erscheint dies relativ ineffizient, wenn eine große Anzahl von Unterverzeichnissen in jedem Verzeichnis angenommen wird abc_*. Eine bessere Lösung wäre in diesem Fall etwa:

(wobei $ Path der Wurzelpfad zum Speicherort mit allen abc_ * -Verzeichnissen ist.)

Get-ChildItem $Path -Filter abc_* | Foreach-Object

Dadurch wird abc * korrekt ausgewählt, aber in diesen Verzeichnissen wird nicht nach foo.settings.xml gesucht. Die Datei foo enthält drei Verzeichnisse unter abc *. Registered User vor 7 Jahren 0
Ich habe es falsch verstanden. Daher müssen Sie das Problem weiter qualifizieren. Muss der Pfad immer mit `abc` _start_ sein, oder enthält er nur _contain_` abc` irgendwo im Pfadnamen? In jedem Fall lautet die Antwort so etwas wie: `Get-ChildItem -Recurse | Where-Object {"Nach geeigneten Pfaden hier filtern"} | Select-String ... `Das einzige, was sich ändert, ist der" Filter für geeignete Pfade hier ". Bryan Winstead vor 7 Jahren 0
Warum nicht nur rekursiv Verzeichnisstrukturen durchsuchen, die dem gewünschten Format entsprechen? ZB `Get-ChildItem -Recurse abc * \ AAA \ SDK \ Settings \ *. *` root vor 7 Jahren 0
Der `-Filter`-Parameter von` Get-ChildItem` ist sehr begrenzt. Ich bin ziemlich sicher, dass es nur für Dateinamen funktioniert, nicht für ganze Pfade, sodass "Where-Object" der Weg nach vorne ist. Bryan Winstead vor 7 Jahren 0
@BryanWinstead, Ja, der Pfad ist immer abc_ * und der Pfad zu foo.settings.xml ist immer auch derselbe. Hauptfrage bearbeitet. Kannst du mit dieser Info ein Beispiel zeigen? Registered User vor 7 Jahren 0
@RegisteredUser Ich habe die Frage mit dem aktualisiert, was ich denke, dass Sie suchen. Lassen Sie mich wissen, wenn ein weiteres Missverständnis vorliegt. Bryan Winstead vor 7 Jahren 0
Hallo @BryanWinstead, das funktioniert super! Vielen Dank, dass Sie sich die Zeit genommen haben, Ihre Antwort zu aktualisieren. Registered User vor 7 Jahren 0