mmarkuss
Goto Top

Ordnernamen mit String aus Ziffern-Zahlenkombination erstellen

Hallo zusammen,

ich habe ein etwas komplexeres Problem, welches ich selbst mittels einer Batch-Datei lösen will / muss, da mein Softwareliefertant dies nicht machen kann ( ...will...).
Ich habe einen Ordner ( C:\ElRech1 ) in welchen fortlaufend xml-Dateien eingespeichert werden. Diese haben außer der Endung *.xml alle eines gemeinsam: irgendwo im Namen der xml stehen Buchstaben. Die Ziffern vor dem "-" rückwärts bis zum nächsten "-" davor sind gesucht.
Beispiel:
02-419892-0-1980-ZE-783-1-0.xml ....hier wird dann die Ziffernkombination 1980 benötigt
oder aber auch
02-419892-0-8965-KBR-71-1-0.xml ..... dementsprechend hier die 8965.
Die Buchstabenkombination ist nicht willkürlich sondern derzeit nur ZE oder KBR ...das kann aber irgendwann auch noch mehr werden . es könnte also hilfreich sein, die möglichen Buchstabenkombination vorab zu definieren
Wenn in dem ursprünglichen Verzeichnis C:\ElRech1 eine neue xml eingespeichert wird, soll im ebenfalls vorhandenen Ordner C:\ElRech2 ein Unterordner mit dem Namen der gefundenen Ziffernkombination erstellt werden ( ...also beim ersten Beispiel : C:\ElRech2\1980 ) ...ist dieser Unterordner bereits vorhanden, dann eine kurze Meldung mit der Option "OK" oder "Cancel". In diesen Unterordner soll dann die xml, einkopiert werden, die den Namen des Ordners definiert hat .
Ergebnis: C:\ElRech2\1980\02-419892-0-1980-ZE-783-1-0.xml

Zu komplex ???

Danke im Voraus für alle Antworten --- auch wenn so nicht lösbar .

Gruß Markus

Content-Key: 392557

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

Ausgedruckt am: 19.03.2024 um 02:03 Uhr

Mitglied: emeriks
Lösung emeriks 13.11.2018 um 16:52:29 Uhr
Goto Top
Hi,
Knoten im Kopf lösen face-wink

Könnte es sein, dass das Grundfromat immer gleich ist?

Zahl-Zahl-Zahl-Zahl-Wort-Zahl-Zahl-Zahl

Und, falls ja, dass du dann einfach immer die 4. Zahl brauchst?

E.
Mitglied: MmarKuss
MmarKuss 13.11.2018 um 16:55:04 Uhr
Goto Top
Leider nicht - kann auch z.B. 307401-4506-ZE-3-52-1.xml sein
Mitglied: emeriks
emeriks 13.11.2018 um 16:55:38 Uhr
Goto Top
Dann nimm doch mal schnell die "Lösung" wieder weg.
Mitglied: MmarKuss
MmarKuss 13.11.2018 um 16:57:22 Uhr
Goto Top
Oopps... das muss aus Versehen passiert sein...muss sehen, wie ich das rückgängig machen kann...
Mitglied: Kraemer
Kraemer 13.11.2018 um 17:00:36 Uhr
Goto Top
Moin,

RegEx ist dein Freund: https://regex101.com/r/tawBmu/1

Gruß
Mitglied: MmarKuss
MmarKuss 13.11.2018 um 17:03:46 Uhr
Goto Top
Danke Kraemer .... blöd nur, wenn man nur über Halbwissen verfügt --- wie ich zum Beispiel... face-sad
Mitglied: Kraemer
Kraemer 13.11.2018 um 17:12:15 Uhr
Goto Top
Zitat von @MmarKuss:

Danke Kraemer .... blöd nur, wenn man nur über Halbwissen verfügt --- wie ich zum Beispiel... face-sad
Bei welcher Hälfte kommst du denn nicht weiter?
Mitglied: 137808
137808 13.11.2018 aktualisiert um 17:25:00 Uhr
Goto Top
I would do this with a more modern scripting language like powershell but if you really need plain oldschool batch, here you go:
@echo off & setlocal ENABLEDELAYEDEXPANSION
set "folder=C:\ELRech2"  
set markers=ZE KBR
for %%a in ("%folder%\*.xml") do (  
  set "name=%%~na"  
  for %%b in (%markers%) do set "name=!name:-%%b=#!"  
  for /f "tokens=1 delims=#" %%b in ("!name!") do (set "part=%%b" & set "num=!part:~-4!")  
  if not exist "%folder%\!num!" md "%folder%\!num!" >nul  
  echo Moving '%%a' to '%folder%\!num!' ...  
  move "%%a" "%folder%\!num!"  
)
Best regards.
Mitglied: MmarKuss
MmarKuss 13.11.2018 um 17:15:34 Uhr
Goto Top
Ich bin reiner Autodidakt und das mit wenig Erfahrung... ich kann eine fertige batch nach einiger Zeit Herumprobieren, was passiert, wenn ich dies oder das ändere, nachvollziehen und so auch auch an andere Gegebenheiten anpassen, aber leider nicht selbst schreiben .
Mitglied: erikro
erikro 14.11.2018 um 09:00:53 Uhr
Goto Top
Moin,

da hast Du den Regex:

([regex]"[0-9]+").match(([regex]"[0-9]+-{1}[A-Z]+").match("$filename").value).value  

Wobei dann in $filename der Dateiname steht. Der Rest ist ein wenig test-path, new-item und move-item. Das solltest Du hinkriegen. face-wink

Liebe Grüße

Erik
Mitglied: Kraemer
Kraemer 14.11.2018 um 09:10:38 Uhr
Goto Top
Zitat von @erikro:
([regex]"[0-9]+").match(([regex]"[0-9]+-{1}[A-Z]+").match("$filename").value).value  
Hast du das jetzt mit Absicht so verkompliziert, oder machst du das immer so?
Mitglied: erikro
erikro 14.11.2018 um 09:23:40 Uhr
Goto Top
Zitat von @Kraemer:

Zitat von @erikro:
([regex]"[0-9]+").match(([regex]"[0-9]+-{1}[A-Z]+").match("$filename").value).value  
Hast du das jetzt mit Absicht so verkompliziert, oder machst du das immer so?

Das ist doch nicht kompliziert. face-wink Zwei ganz einfache ineinander verschachtelte Regexe.
Mitglied: 137808
137808 14.11.2018 aktualisiert um 10:20:33 Uhr
Goto Top
Zitat von @erikro:
Das ist doch nicht kompliziert. face-wink Zwei ganz einfache ineinander verschachtelte Regexe.
Why two regexes? One is totally enough. face-wink

In addition to the Batch variant above, here you go with the Powershell variant.
$folder = 'C:\ELRech2'  
dir $folder -Filter *.xml | ?{!$_.PSIsContainer -and $_-Basename -match '-(\d+)-[a-z]+'} | %{  
    $dest = "$folder\$($matches[1])"  
    if(!(Test-Path $dest)){md $dest | out-null}
    $_ | move-item -Destination $dest -Force -Verbose
}
Best Regards
Mitglied: erikro
erikro 14.11.2018 um 11:05:15 Uhr
Goto Top
Zitat von @137808:

Zitat von @erikro:
Das ist doch nicht kompliziert. face-wink Zwei ganz einfache ineinander verschachtelte Regexe.
Why two regexes? One is totally enough. face-wink

I love one liners. face-wink
Mitglied: 137808
137808 14.11.2018 aktualisiert um 12:05:08 Uhr
Goto Top
Zitat von @erikro:
I love one liners. face-wink
But your nested thing actually doesn't simplify things, it has a lot of overhead, don't stress your cpu with an additional unneeded regex execution face-smile
[regex]::match('307401-4506-ZE-3-52-1.xml','(?i)-(\d+)-[a-z]+').Groups[1].Value  
Mitglied: MmarKuss
MmarKuss 14.11.2018 um 18:48:30 Uhr
Goto Top
Ein Dank an ALLE... ich habs fast face-smile

@echo off &setlocal
pushd "C:\ElRech1"  
for /f "delims=" %%i in ('dir /a-d /b /od *.xml') do set "newest=%%i"  
xcopy /Y "C:\ElRech\%newest%" "C:\ElRech2\"  

@echo off &setlocal
pushd "C:\ElRECH1\PDF"  
for /f "delims=" %%i in ('dir /a-d /b /od *.pdf') do set "newest=%%i"  
start xcopy /Y "C:\ElRECH1\PDF\%newest%" "C:\ElRech2\"  

@echo off & setlocal ENABLEDELAYEDEXPANSION
set "folder=C:\ElRech2"  
set markers=ZE KBR XXX
for %%a in ("%folder%\*.xml") do (  
  set "name=%%~na"  
  for %%b in (%markers%) do set "name=!name:-%%b=#!"  
  for /f "tokens=1 delims=#" %%b in ("!name!") do (set "part=%%b" & set "num=!part:~-4!")  
  if not exist "%folder%\!num!" md "%folder%\!num!" >nul  
  echo Moving '%%a' to '%folder%\!num!' ...  
  move "%%a" "%folder%\!num!"  
)

pause

Der Ordner wird mit dem gewünschten Namen erstellt und die Datei dorthin verschoben face-smile))
Nun soll "nur" noch die ebenfalls kopierte pdf-Datei in den eben neu erstellten Ordner verschoben werden ... da klemmt´s noch.

Hat irgendjemand noch nen Nerv für mich ?

Danke