leax55
Goto Top

Powershell Text aus txt lesen und Ordner anlegen

Hallo Leute,

folgender Script soll mir einen bestimmten Text aus einer Textdatei auslesen und damit einen Ordner anlegen. Die Textdatei muss dann in diesen Ordner reinverschoben werden.

$archivpfad = 'C:\Archiv'  
# Quellpfad
$quellpfad = 'C:\Quelle\*.txt'  

$found = Select-String $quellpfad -Pattern 'Auftragsnummer  : \s*(\d+)' -List | %{  
# neuen Ordnernamen aus dem regex Submatch extrahieren und mit dem Quell-Ordner zu einem Pfad zusammensetzen
   $subordner = join-path $archivpfad $_.Matches.Groups[1].Value}    
    # neuen Ordner erstellen
    md  $subordner -Force | out-null
    # und Datei rein kopieren
    move-item -Path $_.Path -Destination $subordner
}

Leider tut sich garnichts wenn ich den Code starte. Die Dateien bleiben immer noch im Quellpfad liegen. Es kommt auch keine Fehlermeldung oder so.
Ich vermute dass er die Passage 'Auftragsnummer :' nicht finden kann, doch genauso steht es in der Textdatei drinnen. Genauer gesagt so: '| Auftragsnummer : ' und danach kommt die Auftragsnr als 10-stellige Zahl. So habe ich es aber auch versucht einzugeben, dann kommt eine Fehlermeldung. Ich habe auch zich andere Varianten versucht, ohne Leerzeichen usw. hat alles nichts gebracht und bin jetzt echt am verzweifeln.

Hat irgendjemand einen Ratschlag für mich?

So sieht die Textdatei aus:
r

Content-Key: 1097054807

Url: https://administrator.de/contentid/1097054807

Printed on: April 20, 2024 at 02:04 o'clock

Mitglied: 149062
Solution 149062 Jul 28, 2021 updated at 13:37:58 (UTC)
Goto Top
Und woraus soll der Ordnernamen bestehen? Aus der folgenden Auftragsnummer in der selben Zeile oder aus der Zeile darunter? Denn der Code selbst sieht vor aus der Zeile darunter die Daten auszulesen, aber dieser Regex passt zum dem Text übrigens auch nicht.

Wenn die Auftragsnummer der Ordnername sein soll dann geht das hier
$archivpfad = 'C:\Archiv'  
# Quellpfad
$quellpfad = 'C:\Quelle\*.txt'  

Select-String $quellpfad -Pattern 'Auftragsnummer.*?([\da-z]+)' -List | %{  
    # neuen Ordnernamen aus dem regex Submatch extrahieren und mit dem Quell-Ordner zu einem Pfad zusammensetzen
    $subordner = join-path $archivpfad $_.Matches.Groups[1].Value
    # neuen Ordner erstellen
    md $subordner -Force | out-null
    # und Datei rein kopieren
    move-item -Path $_.Path -Destination $subordner -verbose
}
Member: Drohnald
Drohnald Jul 28, 2021 updated at 12:53:23 (UTC)
Goto Top
Ich würde vermuten, dass die Leerzeichen keine Leerzeichen sind, sondern Tabstopps.
Also sowas wie "Auftragsnummer`t:`t" oder so.

Edit: Das von @149062 kommt noch dazu, aber daran kannst du ja noch basteln.
Member: LeaX55
LeaX55 Jul 28, 2021 updated at 13:15:14 (UTC)
Goto Top
Der Ordnername ist die 10-stellige Auftragsnummer die rechts daneben steht.

Ja hast recht da habe ich was verwechselt, habe nämlich noch einen anderen Fall wo die Auftragsnr darunter steht. Habe es soeben korrigiert.

Mit deinem Code passiert leider auch garnix wenn ich es ausführe. Wenn ich aber den Suchtext ändere auf "| Auftragsnummer", verschiebt er mir die Datei einfach in den Archivpfad ohne einen Ordner anzulegen.

Ich habe den Text mal in Word kopiert um zu schauen ob es Tabstopps sind statt Leerzeichen, wie Drohnald vorhin gesagt hat, es sind weder Leerzeichen noch Tabstopps, sondern dieses Celsius Symbol "°" :S

5
Mitglied: 149062
149062 Jul 28, 2021 updated at 13:18:16 (UTC)
Goto Top
Zitat von @LeaX55:
Ich habe den Text mal in Word kopiert um zu schauen ob es Tabstopps sind statt Leerzeichen, wie Drohnald vorhin gesagt hat, es sind weder Leerzeichen noch Tabstopps, sondern dieses Celsius Symbol "°" :S

5

Na dann, ist oben im Quelltext daran angepasst, dann ist egal was dazwischen ist ...
Member: LeaX55
LeaX55 Jul 28, 2021 at 13:32:33 (UTC)
Goto Top
Irgendwas passt ihm noch nicht:

md : Illegales Zeichen im Pfad.
In C:\Test.ps1:11 Zeichen:5
+     md $subordner -Force | out-null
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\Archiv\123456...��������������|:String) [New-Item], Argume 
   ntException
    + FullyQualifiedErrorId : CreateDirectoryArgumentError,Microsoft.PowerShell.Commands.NewItemCommand
 
move-item : Illegales Zeichen im Pfad.
In C:\Test.ps1:13 Zeichen:5
+     move-item -Path $_.Path -Destination $subordner -verbose
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Move-Item], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.MoveItemCommand

Möglicherweise mag er das "|" nicht?

Soll ich dir die Datei irgendwo uploaden?
Mitglied: 149062
149062 Jul 28, 2021 updated at 13:49:06 (UTC)
Goto Top
Kleiner Regex Fehler sorry, ist korrigiert.

Vielleicht ab und zu auch mal selbst etwas lernen und nicht nur copy n pasten ...
Reguläre Ausdrücke

ciao evo
Member: LeaX55
LeaX55 Jul 28, 2021 at 14:00:59 (UTC)
Goto Top
Wunderbar!!! Hat jetzt um die 5000 Dateien fehlerfrei verarbeitet. Ein fettes Dankeschön!

Wie oben schon erwähnt, habe ich noch einen anderen Fall, wo die Bestellnummer darunter steht statt rechts daneben.
Soll ich dafür einen neuen Thread eröffnen?

Das wäre dann das hier wie ich ja vorher drin hatte:
.... 'Bestellnr:' -List -Context 1 | %{  
    [regex]::Match($_.Context.PostContext,'\|\s*(\d+)').Groups[1].Value ...  
}

bdb54af8a21ae26f1bb3bc00c68ae72c
Mitglied: 149062
Solution 149062 Jul 28, 2021, updated at Jul 30, 2021 at 20:01:44 (UTC)
Goto Top
Wie oben schon erwähnt, habe ich noch einen anderen Fall, wo die Bestellnummer darunter steht statt rechts daneben.
$archivpfad = 'C:\Archiv'  
# Quellpfad
$quellpfad = 'C:\Quelle\*.txt'  

Select-String $quellpfad -Pattern 'Bestellnr' -List -Context 1 | %{  
    # neuen Ordnernamen aus dem regex Submatch extrahieren und mit dem Quell-Ordner zu einem Pfad zusammensetzen
    $subordner = join-path $archivpfad ([regex]::Match($_.Context.PostContext,'^\|.*?\|.*?([\da-z]+)').Groups[1].Value)  
    # neuen Ordner erstellen
    md $subordner -Force | out-null
    # und Datei rein kopieren
    move-item -Path $_.Path -Destination $subordner -verbose
}
Member: LeaX55
LeaX55 Jul 29, 2021 updated at 11:52:09 (UTC)
Goto Top
Das funktioniert leider nicht. Er erstellt zwar neue Ordner und verschiebt die Dateien dort rein, nimmt aber als Ordnernamen nicht die Bestellnr direkt darunter sondern den ersten Text von links in der Zeile darunter.
g

Danke auf jeden Fall für deine Mühen und sorry dass ich da selbst nicht viel machen kann. Bei den regex bin ich komplett raus. Werde ich mir aber auf jeden Fall in Ruhe reinziehen.
Mitglied: 149062
149062 Jul 29, 2021 updated at 15:27:39 (UTC)
Goto Top
Zitat von @LeaX55:

Das funktioniert leider nicht. Er erstellt zwar neue Ordner und verschiebt die Dateien dort rein, nimmt aber als Ordnernamen nicht die Bestellnr direkt darunter sondern den ersten Text von links in der Zeile darunter.
g

Danke auf jeden Fall für deine Mühen und sorry dass ich da selbst nicht viel machen kann. Bei den regex bin ich komplett raus. Werde ich mir aber auf jeden Fall in Ruhe reinziehen.

Dann beginnt der erste Text wohl doch mit Nummern, hab es nochmal angepasst, ist halt blöd wenn du da nur "IrgendeinText" reinschreibst und nicht sagst was für Formate da vorkommen könnten ...
Member: LeaX55
LeaX55 Jul 30, 2021 at 07:16:07 (UTC)
Goto Top
Perfekt! vielen Dank!!!
Member: LeaX55
LeaX55 Jul 30, 2021 at 11:04:03 (UTC)
Goto Top
Gibts denn keine Möglichkeit zu sagen dass er immer den String oder die Zahl aus der 2. Spalte nimmt, unabhängig davon ob in der 1. Spalte ein String oder eine Zahl steht?

Ja sorry ich weiss, in meinem Beispiel ist das nicht ersichtlich, hatte an die Sonderfälle nicht gedacht :/
Mitglied: 149062
149062 Jul 30, 2021 at 14:28:40 (UTC)
Goto Top
Zitat von @LeaX55:

Gibts denn keine Möglichkeit zu sagen dass er immer den String oder die Zahl aus der 2. Spalte nimmt, unabhängig davon ob in der 1. Spalte ein String oder eine Zahl steht?
Ist schon berücksichtigt ...
Member: LeaX55
LeaX55 Jul 30, 2021 updated at 15:42:13 (UTC)
Goto Top
Zitat von @149062:

Zitat von @LeaX55:

Gibts denn keine Möglichkeit zu sagen dass er immer den String oder die Zahl aus der 2. Spalte nimmt, unabhängig davon ob in der 1. Spalte ein String oder eine Zahl steht?
Ist schon berücksichtigt ...

auch wenn die 2. Spalte, also das was er auslesen soll, ein Text ist statt einer Zahl?
Hatte nämlich so einen Ausnahmefall, dann hat er einfach die Zahl aus der 3. Spalte genommen...