Powershell: Text in Textdatei finden und als Ordnername vergeben
Hallo Zusammen,
wie im Titel bereits steht, benötige ich ein Script um in einem Ordner, in dem mehrere Textdateien liegen, nach einem bestimmten Text zu suchen, und diesen dann als Ordnernamen einem neu erstellten Ordner zu vergeben. Die Textdatei soll dann in diesen Ordner verschoben werden.
Im Detail:
Als Hinweis noch vllt dass der Text "Bestellnr: XXXXX" in jeder Datei immer vorhanden ist und auch immer in gleicher Position. Evtl. könnte man also auch nach xy Koordinaten gehen anstatt Text zu suchen?
Ich hoffe ich konnte es verständlich erklären.
Ich würde mich freuen wenn Ihr mir ein paar Codebeispiele oder Links nennen könnt mit dem ich arbeiten kann.
Bin leider noch nicht so fit in Powershell.
Alles was ich zusammenbauen konnte ist bisher das:
Bis dahin verstehs ichs noch aber dann für jede Textdatei in der eine andere Bestellnr ist, einen neuen Ordner anlegen und die richtige Textdatei in den Ordner zu verschieben, ist für mich eine Herausforderung.
Vielen Dank schonmal
wie im Titel bereits steht, benötige ich ein Script um in einem Ordner, in dem mehrere Textdateien liegen, nach einem bestimmten Text zu suchen, und diesen dann als Ordnernamen einem neu erstellten Ordner zu vergeben. Die Textdatei soll dann in diesen Ordner verschoben werden.
Im Detail:
- Ordner mit mehreren Textdateien wird Datei für Datei nach einem bestimmten Text im Inhalt durchsucht.
- Nicht der gefundene Text sondern das was rechts daneben steht, muss einer Variable zugewiesen werden. Bsp: in der Datei gibt es eine Stelle wo steht "Bestellnr: 12345" -> es wird nach "Bestellnr:" gesucht -> wenn gefunden, soll "12345" in eine Variable.
- Anschließend soll ein neuer Ordner erstellt werden und der Inhalt der Variable als Ordnername verwendet werden.
- Zuletzt soll die Datei in diesen Ordner verschoben werden (Alle Dateien mit identischer Bestellnr).
Als Hinweis noch vllt dass der Text "Bestellnr: XXXXX" in jeder Datei immer vorhanden ist und auch immer in gleicher Position. Evtl. könnte man also auch nach xy Koordinaten gehen anstatt Text zu suchen?
Ich hoffe ich konnte es verständlich erklären.
Ich würde mich freuen wenn Ihr mir ein paar Codebeispiele oder Links nennen könnt mit dem ich arbeiten kann.
Bin leider noch nicht so fit in Powershell.
Alles was ich zusammenbauen konnte ist bisher das:
$Pfad = 'C:\Neuer Ordner'
$Suchbegriff='Bestellnr:'
ForEach-Object(Get-ChildItem $Pfad | Select-String $Suchbegriff)
Bis dahin verstehs ichs noch aber dann für jede Textdatei in der eine andere Bestellnr ist, einen neuen Ordner anlegen und die richtige Textdatei in den Ordner zu verschieben, ist für mich eine Herausforderung.
Vielen Dank schonmal
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 666020
Url: https://administrator.de/forum/powershell-text-in-textdatei-finden-und-als-ordnername-vergeben-666020.html
Ausgedruckt am: 16.04.2025 um 07:04 Uhr
12 Kommentare
Neuester Kommentar

Moin.
Gruß w.
p.s. Lektüre für Anfänger findest du hier in diesem Kommentar:
Zeichen zählen, um Zeilenläge zu begrenzen
# Pfad in den der neue Ordner erstellt wird
$pfad = 'C:\RootOrdner'
$found = Select-String 'D:\Ordner\*.txt' -Pattern "Bestellnr:\s*(\d+)" -list | %{
# neuen Ordnernamen aus dem regex Submatch extrahieren und mit Root-Ordner zu einem Pfad zusammensetzen
$subordner = join-path $pfad $_.Matches.Groups[1].Value
# neuen Ordner erstellen
md $subordner -Force | out-null
# und Datei rein kopieren
move-item -Path $_.Path -Destination $subordner
}
p.s. Lektüre für Anfänger findest du hier in diesem Kommentar:
Zeichen zählen, um Zeilenläge zu begrenzen

Zitat von @LeaX55:
kannst Du mir vllt noch kurz erklären was das \s*(\d+) nach der Bestellnr bedeutet?
Das sind Regular Expressions und bedeutet matche 0 oder mehrere Leerzeichen worauf Mindestens 1 oder mehrere Nummern folgen, welche durch die Klammern in einen Submatch geladen werden.kannst Du mir vllt noch kurz erklären was das \s*(\d+) nach der Bestellnr bedeutet?
Und eine Zeile drunter das Matches.Groups[1].Value
Damit greife ich auf den oben geklammerten Submatch im Regex (also die Nummer) zuWie muss der Code eigentlich aussehen wenn die Nr unterhalb von "Bestellnr" steht statt rechts daneben?
Also so:
Bestellnr:
XXXXX
# Pfad in den der neue Ordner erstellt wird
$pfad = 'C:\RootOrdner'
$found = Select-String 'D:\Ordner\*.txt' -Pattern "Bestellnr:" -list -Context 1 | %{
# neuen Ordnernamen aus dem regex Submatch extrahieren und mit Root-Ordner zu einem Pfad zusammensetzen
$subordner = join-path $pfad $_.Context.PostContext.split(' ')
# neuen Ordner erstellen
md $subordner -Force | out-null
# und Datei rein kopieren
move-item -Path $_.Path -Destination $subordner
}

Kein Thema minimale Anpassung (s.o.) und auch dat lüppt ...

Steht doch da was ihm nicht passt, lass dir dir Pfad-Variable doch einfach mal anzeigen dann siehst du auch genau welches Zeichen (|) für den Pfad illegal ist ... Mitdenken ... wir kennen ja deine Textdatei nicht!
Wenn du hier nicht exakt spezifizierstwo was steht können wir noch so viele Skripte schreiben bis wir umfallen ...
https://tio.run/##PU29DoIwEN77FDdoqgNE/BucCK4ObA5GDegRSI6W9A41UZ@9NkbZvv ...
Wenn du hier nicht exakt spezifizierstwo was steht können wir noch so viele Skripte schreiben bis wir umfallen ...
https://tio.run/##PU29DoIwEN77FDdoqgNE/BucCK4ObA5GDegRSI6W9A41UZ@9NkbZvv ...

Auf die Extrahierung reduziert, Rest weggelassen ...
sls 'D:\Ordner\*.txt' -Pattern 'BestellNr:\s*(\d+)' -List | %{$_.Matches.Groups[1].Value}
2. Bestellnr:
XXXXX (linksbündig)
XXXXX (linksbündig)
sls 'D:\Ordner\*.txt' -Pattern 'BestellNr' -List -Context 1 | %{
[regex]::Match($_.Context.PostContext,'^(\d+)').Groups[1].Value
}
3. Bestellnr:
XXXXX (mittendrin)
XXXXX (mittendrin)
sls 'D:\Ordner\*.txt' -Pattern 'BestellNr:' -List -Context 1 | %{
[regex]::Match($_.Context.PostContext,'\|\s*(\d+)').Groups[1].Value
}
4. ohne "Bestellnr", nur XXXXX (linksbündig)
Nur eine Kombination aus mehreren Zahlen [0-9] am Anfang einer Zeile? Dann ...sls 'D:\Ordner\*.txt' -Pattern '^(\d+)' -List | %{$_.Matches.Groups[1].Value}