eric01
Goto Top

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

Content-ID: 58289

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

Ausgedruckt am: 26.11.2024 um 03:11 Uhr

mex604
mex604 04.05.2007 um 13:30:23 Uhr
Goto Top
mit jeder scriptsprache kein problem; dateiname als string einlesen, den string
durch den trenner "_" splitten, split => username, verzeichnis erstellen,
datei verschieben. mit perl/python (php geht wohl auch) in ca 30min
gebaut.

mex
bastla
bastla 04.05.2007 um 15:10:30 Uhr
Goto Top
Hallo Eric01 und willkommen im Forum!

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  
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
Biber
Biber 04.05.2007 um 15:16:27 Uhr
Goto Top
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:
>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"  
b) Dateien kopieren
>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\   
Falls die neuen Ordner aus "..\Username\Jahr" bestehen sollen, dann sinngemäß...
>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
Eric01
Eric01 07.05.2007 um 10:40:37 Uhr
Goto Top
Hallo Biber,

danke für Deine Hilfe, hier mein komplettes Werk. Kann man sicherlich noch optimieren ;o)

@echo off
@setlocal
REM +++++++++++++++++++++++++++++++++++++++++++++++++
REM ++++++++ Verschieben von Dateien ++++++++++++++++
REM +++++++++++++++++++++++++++++++++++++++++++++++++

REM +++ für den jeweiligen Unterordner
FOR /D %%i in (c:\Batch\Diktate\*.*) do ( 
   set varPfad=%%i
   call :loop)

:loop 
REM +++ Dateinamen und Pfad ermitteln
FOR /f "delims=" %%D in ('Dir /b %varPfad%\*_*_*.dss') do set varKOM=%varPfad%\%%D  

REM +++ Usernamen ermitteln und Datum ermitteln
FOR /f "delims=_ tokens=1-4" %%I in ('Dir /b %varPfad%\*_*_*.dss') do (  
	set varUser=%%I
	set varJahr=%%J
	set varMonat=%%K
	set varTag=%%L)

REM +++ Ordner anlegen
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%\ 

REM +++ Datei kopieren
copy %varKOM% c:\Batch\Archiv\%varUSER%\ARCH_%varJahr%%varMonat%%varTag%\ 

goto :eof
 
:End
Endlocal
Grüsse
Eric
Biber
Biber 07.05.2007 um 18:46:14 Uhr
Goto Top
Moin Eric01,

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
Eric01
Eric01 09.05.2007 um 16:44:08 Uhr
Goto Top
Hallo Biber,

danke für die Hinweise und die Hilfe.

Es "fliegt" auch.

Frage erledigt.

Gruss
Eric