Batch Teile des Dateinamen auslesen
Hallo zusammen,
ich habe in verschiedenen Unterordnern mehrere Daten liegen
die Datei sehen wie folgt aus:
User1_2007_02_25_15_21.dss
User735_2007_02_25_15_21.dss.xml
User6_2007_02_25_17_53_0001.dss
User63_2007_02_25_16_53_0001.dss.xml
Der Username kann hinsichtlich der Länge variiren. Nach dem Usernamen kommt immer ein "_" und das aktuelle Jahr.
Ich möchte gern die Unterordner durchlaufen, den Usernamen auslesen und dann in separate Unterordner schieben.
Ist das machbar?
Danke und Grüße
Eric
ich habe in verschiedenen Unterordnern mehrere Daten liegen
die Datei sehen wie folgt aus:
User1_2007_02_25_15_21.dss
User735_2007_02_25_15_21.dss.xml
User6_2007_02_25_17_53_0001.dss
User63_2007_02_25_16_53_0001.dss.xml
Der Username kann hinsichtlich der Länge variiren. Nach dem Usernamen kommt immer ein "_" und das aktuelle Jahr.
Ich möchte gern die Unterordner durchlaufen, den Usernamen auslesen und dann in separate Unterordner schieben.
Ist das machbar?
Danke und Grüße
Eric
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 58289
Url: https://administrator.de/contentid/58289
Ausgedruckt am: 26.11.2024 um 03:11 Uhr
6 Kommentare
Neuester Kommentar
Hallo Eric01 und willkommen im Forum!
Für das Aufteilen kannst Du so vorgehen (Eingabe direkt an der Commandline):
Analog dazu kannst Du die beiden Teile auch Variablen zuweisen.
Für die weitere Verarbeitung kann ich auf Basis Deiner bisherigen Informationen noch keinen Vorschlag machen ...
Grüße
bastla
Für das Aufteilen kannst Du so vorgehen (Eingabe direkt an der Commandline):
for /f "tokens=1* delims=_" %i in ('dir /b D:\Daten\*.*') do @echo %i - %j
Für die weitere Verarbeitung kann ich auf Basis Deiner bisherigen Informationen noch keinen Vorschlag machen ...
Grüße
bastla
Moin Eric01,
wenn es nicht ganz so professionell gebaut werden muss, denn wäre es vom CMD-Prompt aus in etwa folgende Strategie:
a) Verzeichnisse anlegen:
b) Dateien kopieren
Falls die neuen Ordner aus "..\Username\Jahr" bestehen sollen, dann sinngemäß...
[ Natürlich ohne das "@ECHO" und ggf. mit MOVE statt COPY. Soll nur eine Skizze sein.]
Gruss
Biber
wenn es nicht ganz so professionell gebaut werden muss, denn wäre es vom CMD-Prompt aus in etwa folgende Strategie:
a) Verzeichnisse anlegen:
>for /f "delims=_ tokens=1,*" %i in ('Dir /b E:\Schnipsel\*_*_*.*') do @ECHO if not exist "c:\neu\%i" md "c:\neu\%i"
if not exist "c:\neu\User1" md "c:\neu\User1"
if not exist "c:\neu\User735" md "c:\neu\User735"
if not exist "c:\neu\User6" md "c:\neu\User6"
if not exist "c:\neu\User63" md "c:\neu\User63"
>for /f "delims=_ tokens=1,*" %i in ('Dir /b E:\Schnipsel\*_*_*.*') do @ECHO copy "%~dpnxi_%j" c:\neu\%i\
copy "E:\Schnipsel\User1_2007_02_25_15_21.dss" c:\neu\User1\
copy "E:\Schnipsel\User735_2007_02_25_15_21.dss.xml" c:\neu\User735\
copy "E:\Schnipsel\User6_2007_02_25_17_53_0001.dss" c:\neu\User6\
copy "E:\Schnipsel\User63_2007_02_25_16_53_0001.dss.xml" c:\neu\User63\
>for /f "delims=_ tokens=1,2,*" %i in ('Dir /b E:\Schnipsel\*_*_*.*') do @echo copy "%~dpnxi_%j_%k" c:\neu\%i\%j\
copy "E:\Schnipsel\User1_2007_02_25_15_21.dss" c:\neu\User1\2007\
copy "E:\Schnipsel\User735_2007_02_25_15_21.dss.xml" c:\neu\User735\2007\
copy "E:\Schnipsel\User6_2007_02_25_17_53_0001.dss" c:\neu\User6\2007\
copy "E:\Schnipsel\User63_2007_02_25_16_53_0001.dss.xml" c:\neu\User63\2007\
[ Natürlich ohne das "@ECHO" und ggf. mit MOVE statt COPY. Soll nur eine Skizze sein.]
Gruss
Biber
Moin Eric01,
Bei den ersten Geh-Versuchen mit einer (neuen) Programmier- oder auch Skriptsprache sind die ersten drei, wesentlich höheren Hürden,
Und da hast Du Dich schon tapfer geschlagen, finde ich.
Ein paar handwerkliche Schnitzer (eben die typischen Anfänger-Fallen) möchte ich noch kurz ansprechen, weil die monatelang unbemerkt bleiben könnten...
- Achte darauf, wo das eigentliche Programm zu Ende ist.... wo nur noch "geCALLte Blöcke" folgen.
Dort muss ein "goto :eof" (oder bei eigener Endemarke ein "goto :ende" stehen,
sonst werden die Unterroutinen auch noch einmal (mehr) ausgeführt.
- Hier kannst du es etwas lesbarer mehrzeilig gestalten und beiläüfig einen Tippfehler beheben
(Streiche "%verMonat%", Setze "%varMonat%")
- die Endemarke ":End" und der darauf folgende Befehl "Endlocal" werden nie erreicht werden können...
...da an keiner Stelle ein "goto :End" steht. Siehe den ersten Hinweis.
Aber ich denke, wir können Deine Frage getrost auf "erledigt" setzen, oder?
Gruss
Biber
Kann man sicherlich noch optimieren ;o)
Natürlich... aber das kommt irgendwann von allein.Bei den ersten Geh-Versuchen mit einer (neuen) Programmier- oder auch Skriptsprache sind die ersten drei, wesentlich höheren Hürden,
- erstmal das Ganze überhaupt zum Fliegen zu bringen,
- zu verstehen, warum und wie es überhaupt funktioniert
- es so wart- und pflegbar zu schreiben, dass Du es auch noch in einem Vierteljahr nachvollziehen kannst.
Und da hast Du Dich schon tapfer geschlagen, finde ich.
Ein paar handwerkliche Schnitzer (eben die typischen Anfänger-Fallen) möchte ich noch kurz ansprechen, weil die monatelang unbemerkt bleiben könnten...
- Achte darauf, wo das eigentliche Programm zu Ende ist.... wo nur noch "geCALLte Blöcke" folgen.
Dort muss ein "goto :eof" (oder bei eigener Endemarke ein "goto :ende" stehen,
sonst werden die Unterroutinen auch noch einmal (mehr) ausgeführt.
....
FOR /D %%i in (c:\Batch\Diktate\*.*) do (
set varPfad=%%i
call :loop)
<b> goto :eof</b>
~~~ Ende des <i>eigentlichen </i> Batches; der Rest sind Unterroutinen
:loop
- Hier kannst du es etwas lesbarer mehrzeilig gestalten und beiläüfig einen Tippfehler beheben
(Streiche "%verMonat%", Setze "%varMonat%")
...[JETZT]
if not exist c:\Batch\Archiv\%varUSER% md c:\Batch\Archiv\%varUSER%
if not exist c:\Batch\Archiv\%varUSER%\ARCH_%varJahr%%verMonat%%varTag%\ md c:\Batch\Archiv\%varUSER%\ARCH_%varJahr%%varMonat%%varTag%\
....
[NEU, etas lesbarer und ausreichend ist nur das "längere" Verzeichnis anzulegen:]
if not exist c:\Batch\Archiv\%varUSER%\ARCH_%varJahr%%v<u>a</u>rMonat%%varTag% (
md c:\Batch\Archiv\%varUSER%\ARCH_%varJahr%%varMonat%%varTag%\
)
- die Endemarke ":End" und der darauf folgende Befehl "Endlocal" werden nie erreicht werden können...
...da an keiner Stelle ein "goto :End" steht. Siehe den ersten Hinweis.
Aber ich denke, wir können Deine Frage getrost auf "erledigt" setzen, oder?
Gruss
Biber