CMD zum Auslesen aus .txt als Variable zum Dateien verwalten
Hallo zusammen,
ich bin neu hier.
Ich bin gerade dabei eine Batch-Datei(cmd) zu schreiben, welche eine .txt-Datei ausliest und aufsplittet.
Der Text sieht ungefähr so aus:
Statistik:
(das geht bis Sortfach 21)
Nun ist es so, dass ich parallell zu der Text-Datei einen Ordner mit PDF bekomme, welche ich sortieren muss.
Die PDF haben die 9-stelligen Zahlen im Dateinamen.
Am besten sollen sie in Ordner verteilt werden (Ordnername: Sortfach 1, Sortfach 2, usw.)
Das Problem ist, dass ich diese Statistik jeden Monat bekomme und es nicht immer gleich viele Zahlen bei einem "Sortfach" sind.
Ich habe schon sehr viel probiert, jedoch immer gescheitert.
Ich hoffe, Ihr könnt mir weiterhelfen.
ich bin neu hier.
Ich bin gerade dabei eine Batch-Datei(cmd) zu schreiben, welche eine .txt-Datei ausliest und aufsplittet.
Der Text sieht ungefähr so aus:
Statistik:
Sortfach 1 (Bayern): 25558 Daten
188310400
Sortfach 2 (NRW): 24850 Daten
184940005
Sortfach 3 (Sachsen): 0 Daten
Sortfach 4 (NRW): 12930 Daten
183411401
Sortfach 5 (Bayern): 8449 Daten
184212505
Sortfach 6 (Berlin): 20383 Daten
182171012
188030775
187202793
185830517
185230076
188035612
186431652
183170002
188036123
Nun ist es so, dass ich parallell zu der Text-Datei einen Ordner mit PDF bekomme, welche ich sortieren muss.
Die PDF haben die 9-stelligen Zahlen im Dateinamen.
Am besten sollen sie in Ordner verteilt werden (Ordnername: Sortfach 1, Sortfach 2, usw.)
Das Problem ist, dass ich diese Statistik jeden Monat bekomme und es nicht immer gleich viele Zahlen bei einem "Sortfach" sind.
Ich habe schon sehr viel probiert, jedoch immer gescheitert.
Ich hoffe, Ihr könnt mir weiterhelfen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 846256428
Url: https://administrator.de/contentid/846256428
Ausgedruckt am: 25.11.2024 um 11:11 Uhr
21 Kommentare
Neuester Kommentar
Moin,
Warum ein Batch-Script und keine Powershell?
Gruß
C.C.
Warum ein Batch-Script und keine Powershell?
Gruß
C.C.
Moin,
Naklar, ist dies mit Powershell problemlos umsetzbar. @colinardo hat für Anfänger ein Übersicht zusammengefasst. Über die Suche (rechts oben) findest du Scripte, die du nur noch anpassen müsstest.
Aber da du bereits Arbeit in das Batch-Script investiert hast, zeig doch mal was du schon hast.
Gruß
C.C.
Naklar, ist dies mit Powershell problemlos umsetzbar. @colinardo hat für Anfänger ein Übersicht zusammengefasst. Über die Suche (rechts oben) findest du Scripte, die du nur noch anpassen müsstest.
Aber da du bereits Arbeit in das Batch-Script investiert hast, zeig doch mal was du schon hast.
Gruß
C.C.
Zitat von @Haberl92:
Hallo zusammen,
ich bin neu hier.
Ich bin gerade dabei eine Batch-Datei(cmd) zu schreiben, welche eine .txt-Datei ausliest und aufsplittet.
Der Text sieht ungefähr so aus:
Statistik:
(das geht bis Sortfach 21)
Nun ist es so, dass ich parallell zu der Text-Datei einen Ordner mit PDF bekomme, welche ich sortieren muss.
Die PDF haben die 9-stelligen Zahlen im Dateinamen.
Am besten sollen sie in Ordner verteilt werden (Ordnername: Sortfach 1, Sortfach 2, usw.)
Das Problem ist, dass ich diese Statistik jeden Monat bekomme und es nicht immer gleich viele Zahlen bei einem "Sortfach" sind.
Ich habe schon sehr viel probiert, jedoch immer gescheitert.
Ich hoffe, Ihr könnt mir weiterhelfen.
Dann ist auch hierfür die Suche brauchbar. Deine Frage wird regelmäßig, im gleichen Wortlaut Gestell und beantwortet.Hallo zusammen,
ich bin neu hier.
Ich bin gerade dabei eine Batch-Datei(cmd) zu schreiben, welche eine .txt-Datei ausliest und aufsplittet.
Der Text sieht ungefähr so aus:
Statistik:
Sortfach 1 (Bayern): 25558 Daten
> 188310400
> Sortfach 2 (NRW): 24850 Daten
> 184940005
> Sortfach 3 (Sachsen): 0 Daten
> Sortfach 4 (NRW): 12930 Daten
> 183411401
> Sortfach 5 (Bayern): 8449 Daten
> 184212505
> Sortfach 6 (Berlin): 20383 Daten
> 182171012
> 188030775
> 187202793
> 185830517
> 185230076
> 188035612
> 186431652
> 183170002
> 188036123
Nun ist es so, dass ich parallell zu der Text-Datei einen Ordner mit PDF bekomme, welche ich sortieren muss.
Die PDF haben die 9-stelligen Zahlen im Dateinamen.
Am besten sollen sie in Ordner verteilt werden (Ordnername: Sortfach 1, Sortfach 2, usw.)
Das Problem ist, dass ich diese Statistik jeden Monat bekomme und es nicht immer gleich viele Zahlen bei einem "Sortfach" sind.
Ich habe schon sehr viel probiert, jedoch immer gescheitert.
Ich hoffe, Ihr könnt mir weiterhelfen.
Alternativ kannst du meine Antwort melden und ein Moderator wird sich deinem Problem annehmen.
Gruß
C.C.
Servus @Haberl92 , willkommen auf Administrator.de!
(Kommentare zu den Zeilen siehe Code)
[OT]
@148656
Ich bitte dich höflichst um mehr Engagement statt hier in den Posts nur heiße Luft zu verbreiten. Solche Posts machen ein Forum letztendlich kaputt. Würdest du bswp. auf StackOverflow nur solche "Lehrer-Antworten" finden wäre es nicht so erfolgreich geworden. Danke!
[/OT]
Grüße Uwe
Zitat von @Haberl92:
Also bin ich ganz am Anfang und wäre über einen Code für andere Skripte auch sehr dankbar
Gerne, damit kann ich dienen. Hiermit kannst du das gewünschte z.B. mittels Powershell erreichen.Also bin ich ganz am Anfang und wäre über einen Code für andere Skripte auch sehr dankbar
(Kommentare zu den Zeilen siehe Code)
# Textdatei mit der Nummernzuordnung
$datafile = 'D:\Data\data.txt'
# Ordner mit den PDF-Dateien
$datadirectory = 'D:\Data\pdfs'
# Textdatei in ein PSCustomObject einlesen um Zuordnung zu vereinfachen
$sortkeys = [regex]::matches((gc $datafile -raw),'(?ism)(^Sortfach \d+).*?$(.*?)(?=^Sortfach|\Z)').Captures | %{[pscustomobject]@{Sortfach=$_.Groups[1].Value;Numbers=$_.Groups[2].Value}}
# Alle PDF-Dateien nach der Nummer im Basename der Datei sortieren und den Sortfach-Ordnern zuordnen
ls $datadirectory -File -Filter *.pdf -PipelineVariable f | group {$sortkeys | ?{$_.Numbers -match [regex]::match($f.Basename,'\d{9}').Value} | select -Expand Sortfach} | ?{$_.Name -ne ''} | %{
# Dateien der Gruppe in den neuen Zielordner verschieben
$_.Group | move-item -Destination (md (join-path $datadirectory $_.Name) -Force).FullName -Verbose
}
[OT]
@148656
Ich bitte dich höflichst um mehr Engagement statt hier in den Posts nur heiße Luft zu verbreiten. Solche Posts machen ein Forum letztendlich kaputt. Würdest du bswp. auf StackOverflow nur solche "Lehrer-Antworten" finden wäre es nicht so erfolgreich geworden. Danke!
[/OT]
Grüße Uwe
[OT]
Lieber @colinardo,
ich nehme deine Kritik gern zur Kenntnis und Verweise auf die letzte Diskussion diesbezüglich.
Selbst auf StackOverflow.com werden User die mit nichts anderem, als dem frommen Wunsch "Ein andere möge meinen Arbeit machen." kommen, auf Anleitungen sowie ähnliche Beiträge innerhalb des Forums verwiesen. StackOverflow.org ist da etwas überschaubarer. Deine Definition von "Engagement" sollte man in einem gesonderten Thread erörtern. Einem Anfänger die Lösung in Form von "One-Liners" zu kredenzen, macht es dem lernwilligem Einsteiger nicht Einfacher oder Verständlicher.
Gruß
C.C.
[/OT]
Lieber @colinardo,
ich nehme deine Kritik gern zur Kenntnis und Verweise auf die letzte Diskussion diesbezüglich.
Selbst auf StackOverflow.com werden User die mit nichts anderem, als dem frommen Wunsch "Ein andere möge meinen Arbeit machen." kommen, auf Anleitungen sowie ähnliche Beiträge innerhalb des Forums verwiesen. StackOverflow.org ist da etwas überschaubarer. Deine Definition von "Engagement" sollte man in einem gesonderten Thread erörtern. Einem Anfänger die Lösung in Form von "One-Liners" zu kredenzen, macht es dem lernwilligem Einsteiger nicht Einfacher oder Verständlicher.
Gruß
C.C.
[/OT]
Zitat von @Haberl92:
Gleich noch eine Frage vorweg:
Die PDFs haben die Nummer am Anfang des Dateinamen, das bedeutet, dass noch andere Buchstaben und Zahlen im Namen stehen.
Funktioniert das damit auch?
Ja, dem Code oben ist es egal wo die Nummer im Dateinamen steht, er findet sie dank Regular Expressions in diesem Abschnitt automatisch.Gleich noch eine Frage vorweg:
Die PDFs haben die Nummer am Anfang des Dateinamen, das bedeutet, dass noch andere Buchstaben und Zahlen im Namen stehen.
Funktioniert das damit auch?
[regex]::match($f.Basename,'\d{9}').Value
[OT]
Wir sind hier zu helfen, und nicht die "Arbeit anderer zu machen". Man sollte das nicht jedem unterstellen der hier eine Frage stellt. Sicher gibt es die ein oder anderen User die das ausnutzen, aber was kümmert mich das, ich antworte hier nicht primär nur dem "einen" User der die Frage selbst stellt, sondern stelle hier eine Lösung öffentlich ein die auch für x andere User die hier vorbei schauen eine Hilfestellung sein kann.
[/OT]
Zitat von @148656:
Selbst auf StackOverflow.com werden User die mit nichts anderem, als dem frommen Wunsch "Ein andere möge meinen Arbeit machen." kommen,
Aber eher selten.Selbst auf StackOverflow.com werden User die mit nichts anderem, als dem frommen Wunsch "Ein andere möge meinen Arbeit machen." kommen,
Wir sind hier zu helfen, und nicht die "Arbeit anderer zu machen". Man sollte das nicht jedem unterstellen der hier eine Frage stellt. Sicher gibt es die ein oder anderen User die das ausnutzen, aber was kümmert mich das, ich antworte hier nicht primär nur dem "einen" User der die Frage selbst stellt, sondern stelle hier eine Lösung öffentlich ein die auch für x andere User die hier vorbei schauen eine Hilfestellung sein kann.
Einem Anfänger die Lösung in Form von "One-Liners" zu kredenzen, macht es dem lernwilligem Einsteiger nicht Einfacher oder Verständlicher.
Deswegen muss man hier nicht auf produktiven Input verzichten der sich dem explizit dem Thema widmet statt einen User dauernd nur mit Phrasen ala "Benutze doch bitte unsere Suche, da wird dir geholfen" zu bombardieren. Solche Threads schaut sich hinterher kaum einer mehr an und schreckt andere User hier nur ab. Das ist übrigens auch in unseren Diskussionsrichtlinien so hinterlegt.[/OT]
Zitat von @Haberl92:
Nun noch eine Frage:
Kann ich in den Code noch eine Variable setzen im Dateipfad?
Die Variable müsste ich dann bei jedem Ausführen selber eingeben.
Nun noch eine Frage:
Kann ich in den Code noch eine Variable setzen im Dateipfad?
Die Variable müsste ich dann bei jedem Ausführen selber eingeben.
Ja kein Problem, z.B.
$var = Read-Host "Deine Eingabe bitte"
$datadirectory = "d:\Pfad\$var"
Dazu im Kopf des Skripts den Parameter definieren
param(
[String]$var
)
$datadirectory = "d:\Pfad\$var"
dann über die Komandozeile mitgeben
.\script.ps1 -var 'Dein Wert'
Du musst bei Variablen innerhalb von Strings normale Anführungszeichen statt Hochkommas verwenden, denn nur innerhalb von normalen Anführungszeichen werden Variablen geparst!
Außerdem musst du wenn Strings auf die Variable folgen die gültige Zeichen einer Variablen sind die Variable mit ${} kappseln
Außerdem musst du wenn Strings auf die Variable folgen die gültige Zeichen einer Variablen sind die Variable mit ${} kappseln
$var = Read-Host "Nummer eingeben"
$datafile = "P:\test\sortierung\$var\${var}_Report.txt"
$datadirectory = "P:\test\rechnungen\$var"
Zitat von @colinardo:
Und dem Skript den Wert
dann über die Komandozeile mitgeben
Und dem Skript den Wert
dann über die Komandozeile mitgeben
>> .\script.ps1 -var 'Dein Wert'
>>
was meinst du damit?
Du verwechselst hier was, das zweite war eine alternative Variante und hat nichts mit der ersten zu tun!
Lies bitte mein letztes Kommentar ganz genau! Dann verstehst du warum es bei dir nicht funktioniert. Du verwendest Hochkommas statt Anführungszeichen deswegen wird die Variable innerhalb des Strings nicht aufgelöst.
Also:
$var = Read-Host "Nummer eingeben"
$datafile = "P:\test\sortierung\$var\${var}_Report.txt"
$datadirectory = "P:\test\rechnungen\$var"
Hier kannst du das übrigens auch nachlesen
Variable expansion in strings and here-strings
Strings mit Hochkommas verwendet man nur dann wenn man nicht möchte das spezielle Zeichen anders darin interpretiert werden. Das mache ich grundsätzlich immer wenn ich darin keine Variablen oder Subexpressions verwende, denn es könnte ja sein das der User da Zeichen einsetzt die die Powershell ansonsten anders interpretiert.
So, da das Problem vom TO gelöst ist.
[OT]
@colinardo kannst Du dich bitte entscheiden was Du willst?
Mal soll es für den Anfänger sein, dann lieferst DU Input für den semiprofessionellen Fortgeschrittenen und der Profi geht leer aus.
Ich hatte den TO gefragt, muss es wirklich Batch sein.
Nach seiner Antwort, habe ich ihn auf deinen Beitrag verwiesen und ihm den Tipp für die SuFu gegeben.
Wenn sich der TO wirklich mit dem Thema befasst hätte, würde man mindestens einen Tag nichts von ihm hören. Da er sich mit den Links und dessen Inhalt beschäftigt.
Auf den Hinweis, er möge das Posten was er bereits erarbeitet hat, kam die Default-Antwort. Was soll ich hiervon halten. In den letzten 3 Tagen haben DU und @em-pie in anderen Fragen zum Thema "Powershell und Batch" mehrfach gezeigt, wie Daten aus einem Textfile eingelesen und verarbeitet werden.
Ich bin der Letzte, der einen Kollegen hängen lässt aber wie soll man einem Kollegen nachhaltig helfen, der keine (Internen)Links lesen will. Muss man jedes Mal erst nachfragen, "Was machst du, wenn das Script mitten in der Nacht abändert werden muss, um Schaden von der Firma oder vom Kunden fernzuhalten?".
Kommen wir zum Profi, der auf der Strecke bleibt. Strukturierte Ausnahmebehandlung kennst Du sicherlich? Warum fehlt dies immer in deinen "Skripten"?
Gruß
Case Closed
[/OT]
[OT]
@colinardo kannst Du dich bitte entscheiden was Du willst?
Mal soll es für den Anfänger sein, dann lieferst DU Input für den semiprofessionellen Fortgeschrittenen und der Profi geht leer aus.
Ich hatte den TO gefragt, muss es wirklich Batch sein.
Nach seiner Antwort, habe ich ihn auf deinen Beitrag verwiesen und ihm den Tipp für die SuFu gegeben.
Wenn sich der TO wirklich mit dem Thema befasst hätte, würde man mindestens einen Tag nichts von ihm hören. Da er sich mit den Links und dessen Inhalt beschäftigt.
Auf den Hinweis, er möge das Posten was er bereits erarbeitet hat, kam die Default-Antwort. Was soll ich hiervon halten. In den letzten 3 Tagen haben DU und @em-pie in anderen Fragen zum Thema "Powershell und Batch" mehrfach gezeigt, wie Daten aus einem Textfile eingelesen und verarbeitet werden.
Ich bin der Letzte, der einen Kollegen hängen lässt aber wie soll man einem Kollegen nachhaltig helfen, der keine (Internen)Links lesen will. Muss man jedes Mal erst nachfragen, "Was machst du, wenn das Script mitten in der Nacht abändert werden muss, um Schaden von der Firma oder vom Kunden fernzuhalten?".
Kommen wir zum Profi, der auf der Strecke bleibt. Strukturierte Ausnahmebehandlung kennst Du sicherlich? Warum fehlt dies immer in deinen "Skripten"?
Gruß
Case Closed
[/OT]