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

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

Member: emeriks
Solution emeriks Nov 13, 2018 at 15:52:29 (UTC)
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.
Member: MmarKuss
MmarKuss Nov 13, 2018 at 15:55:04 (UTC)
Goto Top
Leider nicht - kann auch z.B. 307401-4506-ZE-3-52-1.xml sein
Member: emeriks
emeriks Nov 13, 2018 at 15:55:38 (UTC)
Goto Top
Dann nimm doch mal schnell die "Lösung" wieder weg.
Member: MmarKuss
MmarKuss Nov 13, 2018 at 15:57:22 (UTC)
Goto Top
Oopps... das muss aus Versehen passiert sein...muss sehen, wie ich das rückgängig machen kann...
Member: Kraemer
Kraemer Nov 13, 2018 at 16:00:36 (UTC)
Goto Top
Moin,

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

Gruß
Member: MmarKuss
MmarKuss Nov 13, 2018 at 16:03:46 (UTC)
Goto Top
Danke Kraemer .... blöd nur, wenn man nur über Halbwissen verfügt --- wie ich zum Beispiel... face-sad
Member: Kraemer
Kraemer Nov 13, 2018 at 16:12:15 (UTC)
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 Nov 13, 2018 updated at 16:25:00 (UTC)
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.
Member: MmarKuss
MmarKuss Nov 13, 2018 at 16:15:34 (UTC)
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 .
Member: erikro
erikro Nov 14, 2018 at 08:00:53 (UTC)
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
Member: Kraemer
Kraemer Nov 14, 2018 at 08:10:38 (UTC)
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?
Member: erikro
erikro Nov 14, 2018 at 08:23:40 (UTC)
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 Nov 14, 2018 updated at 09:20:33 (UTC)
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
Member: erikro
erikro Nov 14, 2018 at 10:05:15 (UTC)
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 Nov 14, 2018 updated at 11:05:08 (UTC)
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  
Member: MmarKuss
MmarKuss Nov 14, 2018 at 17:48:30 (UTC)
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