Wählen Sie nachfolgende Zeichen nach einem identifizierenden Zeichen in Powershell aus

3

Ich habe einen sehr großen Ordner mit Dateien, von denen ich mit einem Skript von mir organisiere, das die Dateien genau so verfeinert, wie ich es brauche. Diese Elemente werden ähnlich wie in den folgenden Beispielen benannt:

  • Foo (Bar).txt
  • My File (This is) (My File).doc
  • Example (File) (Stuff) (Things).xml

Ich muss jedes Zeichen des Dateinamens ziehen nach dem (aber einschließlich) der ersten offenen Klammer "(" ohne die Dateierweiterung. Meine gewünschte Ausgabe für dieses Beispiel wäre:

  • (Bar)
  • (This is) (My File)
  • (File) (Stuff) (Things)

Ich habe erfolglos an der folgenden Zeile herumgespielt und bin mir nicht sicher, ob dies überhaupt die beste Lösung für dieses Problem wäre:

Get-ChildItem "*" | ForEach-Object { $_.SubString( $_.IndexOf('\(')+1 ) }
root
quelle

Antworten:

2

Ich denke du bist nah dran. Entfernen Sie zunächst den Namen des Pfads und der Erweiterung mit der Taste BaseName Eigentum von FileInfo. Dann nehmen Sie einfach den Teilstring beginnend mit dem Index, der von zurückgegeben wurde IndexOf:

Get-ChildItem * | ForEach-Object { $_.BaseName.SubString( $_.BaseName.IndexOf('(') ) }

Vielleicht möchten Sie jedoch eine Fehlerbehandlung für den Fall hinzufügen, dass es keine gibt.

Get-ChildItem * | ForEach-Object { $start = $_.BaseName.IndexOf('('); if($start -ge 0){$_.BaseName.SubString( $_.BaseName.IndexOf('(') )} }
zdan
quelle
Das liegt daran, dass das für mich sehr nützlich ist. hoffe das OP findet es genauso!
Debra
Sehr hilfreich! Die erste Zeile funktioniert hervorragend, obwohl ich nicht sicher bin, warum Sie das "P" in Ihre zweite Zeile aufgenommen haben. Wenn Sie es entfernen, funktioniert es großartig. Ich habe auch "Select -uniq" am Ende der Zeile hinzugefügt, um doppelte Einträge zu entfernen. Was ich damit beendet habe, ist das Folgende, danke für Ihre Hilfe: Get-ChildItem * | ForEach-Object { $start = $_.BaseName.IndexOf(''); if($start -ge 0){$_.BaseName.SubString( $_.BaseName.IndexOf('(') )} else{$ErrorAction} } | Select -uniq
root