besenwesen
Goto Top

Batch-Dateien: Unterverzeichnisse auslesen und Dateien umbenennen

Hallo Zusammen,

ich habe mich hier schon umgesehen, aber eine Loesung fuer mein Problem leider nicht gefunden...

Daher ein neuer Beitrag.


Also ich hab folgende Verzeichnisstruktur auf einem Server:

x:\Projektunterlagen\Projekt1\mitarbeiter1_0702.xls
x:\Projektunterlagen\Projekt1\mitarbeiter2_0702.xls
x:\Projektunterlagen\Projekt1\mitarbeiter3_0702.xls
...
x:\Projektunterlagen\Projekt2\mitarbeiter1_0702.xls
x:\Projektunterlagen\Projekt2\mitarbeiter2_0702.xls
...


so geht das immer weiter.
Jetzt habe ich ein Batchscript geschrieben, welches mir von dem lok. PC gemaess obigem Muster z.B. von C:\Projektunterlagen\* alles mit der selben Struktur nach x:\Projektunterlagen\* kopiert.
Allerdings sind die Dateien auf dem lok. PC maskiert(?) wie folgt:
mitarbeiter3_JJMM.xls

Mein Script kopiert somit die maskierten Dateien auf den Server.

Jetzt habe ich zwar eine Idee, da ich alledings ein Anfaenger in Sachen Batch-Dateien bin, keine Idee wie ich es geloest gekomme.

Ich hab mir folgendes ausgedacht.

a) ich benenne die Dateien beim kopieren um.
vllt mit FIND JJMM und REPLACE(?)

b) ich lese nach dem kopieren alle Dateien aus den Unterverzeichnissen aus und benenne sie dann um.


Hoffe ich hab das einigermassen verstaendlich erklaert und hoffe mir kann jmd helfen...

Content-Key: 51784

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

Printed on: April 23, 2024 at 07:04 o'clock

Member: Biber
Biber Feb 15, 2007 at 14:44:22 (UTC)
Goto Top
Moin besenwesen,

willkommen im Forum.
Rückfragen:
x:\Projektunterlagen\Projekt1\mitarbeiter1_0702.xls
Ist "mitarbeiter1_0702.xls" ein Verzeichnisname oder ein Dateiname?

mitarbeiter3_JJMM.xls
Und soll jetzt die konkrete lokale Datei "c:\.....Projektunterlagen\mitarbeiter1_0702.xls" in das Verzeichnis X:\...\ProjektEINS\"... oder ins "X:\...ProjektZWEI"?

Bzw. Frage: Wo leitest Du die Projektzugehörigkeit ab?

Bitte noch mal langsam erklären für ältere Mitbiber wie mich.

Danke
Biber
Member: besenwesen
besenwesen Feb 15, 2007 at 14:54:12 (UTC)
Goto Top
Moin besenwesen,

willkommen im Forum.
Danke!

Rückfragen:
>
x:\Projektunterlagen\Projekt1\mitarbeiter1_0702.xls
Ist "mitarbeiter1_0702.xls" ein
Verzeichnisname oder ein Dateiname?
Dateiname. [siehe an dem .xls... ;) ]


> mitarbeiter3_JJMM.xls
Und soll jetzt die konkrete lokale Datei
"c:\.....Projektunterlagen\mitarbeiter1_0702.xls"
in das Verzeichnis
X:\...\ProjektEINS\"...
oder ins
"X:\...ProjektZWEI"?
nein, die lok. Dateien haben das Muster mitarbeiter1_JJMM.xls und werden aktuell auch so kopiert.
Mit dem Verzeichnisbaum
c:\.....Projektunterlagen\Hans\mitarbeiter1_JJMM.xls
c:\.....Projektunterlagen\Peter\mitarbeiter1_JJMM.xls

Bzw. Frage: Wo leitest Du die
Projektzugehörigkeit ab?
Die Projekte haben Namen. Pojekt1 und 2 waren ja nur Beispiele.
Ich koennte auch
c:\.....Projektunterlagen\Hans\mitarbeiter1_JJMM.xls
c:\.....Projektunterlagen\Peter\mitarbeiter1_JJMM.xls
schreiben

ok, ich ....


REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Variablen
SET quellverzeichnis=C:\Projektunterlagen\resourcenplanung\02_Rapportzettel_2007_02
REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Datumsinformationen ermitteln
@for /F "tokens=1,2,3,4 delims=. " %%a in ('date /t') do set datum=%%c_%%b
REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Zielverzeichnis festlegen
SET zielverzeichnis=D:\Projektunterlagen\resourcenplanung\02_Rapportzettel_%datum%

REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Pruefen ob Quell-Verzeichnis existiert
CD %quellverzeichnis%

IF errorlevel=1 (
ECHO Quellverzeichnis %quellverzeichnis% existiert nicht
GOTO :eof
)

REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Pruefen ob Ziel-Verzeichnis existiert
CD %zielverzeichnis%

IF errorlevel=1 (
MKDIR D:\Projektunterlagen\resourcenplanung\02_Rapportzettel_%datum%
)

ECHO.
ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ECHO Kopiere alles von
ECHO %quellverzeichnis%
ECHO nach
ECHO %zielverzeichnis%
ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ECHO.

REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Kopieren / works
REM XCOPY %quellverzeichnis% %zielverzeichnis% /s

so. das wird aktuell gemacht.
Member: Biber
Biber Feb 15, 2007 at 15:30:23 (UTC)
Goto Top
Okay.... wenn ich jetzt als richtig verstanden habe, dann existiert unterhalb des %quellverzeichnis% keine weitere Struktur, sondern nur noch Dateien.

Dann könnte der zweite Teil Deines Batchs so ausklingen:

...
REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Pruefen ob Ziel-Verzeichnis existiert
If not exist "%zielverzeichnis%" MKDIR "%zielverzeichnis%"  
REM z.B.D:\Projektunterlagen\resourcenplanung\02_Rapportzettel_%datum%

ECHO.
ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ECHO Kopiere alles von
ECHO %quellverzeichnis% 
ECHO nach 
ECHO %zielverzeichnis%
ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ECHO.

REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Kopieren / works

 XCOPY "%quellverzeichnis%" "%zielverzeichnis%" /s  
PushD "Zielverzeichnis%   
For /f "delims=_ tokens=1-2" %%i in ('dir /b /a-d *_????.xls ) do Ren "%%i_%%j.xls" "%%i.xls"  
POPD

HTH
Biber
Member: besenwesen
besenwesen Feb 15, 2007 at 15:35:11 (UTC)
Goto Top
Okay.... wenn ich jetzt als richtig
verstanden habe, dann existiert unterhalb des
%quellverzeichnis% keine weitere Struktur,
sondern nur noch Dateien.

nein, in %quellverzeichnis% seht der Pfad ohne Projekte.
Ich muesste also z.B. ein
cd %quellverzeichnis%\Projekt1
machen, damit ich an die Datei rankomme.
danach koennte ich die darin enthaltenen Dateienamen nach dem Muster 'JJMM' durchsuchen und umbenennen

For /f "delims=_ tokens=1-2" %%i in ('dir /b /a-d *_????.xls ) do Ren "%%i_%%j.xls" "%%> i.xls"
da bekomme ich immer den Fehler
Die Datei "'dir /b /a-d *_????.xls" kann nicht gefunden werden.
Member: Biber
Biber Mar 02, 2007 at 15:58:17 (UTC)
Goto Top
Moin besenwesen,

dann nimm mal bitte in den letzten drei Zeilen beim DIR noch den Parameter /S mit rein:
....
PushD "Zielverzeichnis%   
For /f "delims=_ tokens=1-2" %%i in ('dir /b /s /a-d *_????.xls ) do Ren "%%i_%%j.xls" "%%i.xls"  
POPD

Gruss Biber
Member: besenwesen
besenwesen Mar 03, 2007 at 13:48:47 (UTC)
Goto Top
Moin besenwesen,

dann nimm mal bitte in den letzten drei
Zeilen beim DIR noch den Parameter /S mit
rein:
....
> PushD "Zielverzeichnis%   
> For /f "delims=_ tokens=1-2" %%i  
> in ('dir /b /s /a-d *_????.xls ) do Ren  
> "%%i_%%j.xls" "%%i.xls"  
> POPD
> 

Gruss Biber

das habe ich auch schon versucht und mir den Wert der Variablen %%i ausgeben lassen.
Er schneidet mir den Dateinamen mittendrin ab.
Jetzt weiss ich nicht, ob die Ausgabebreite zu kurz ist oder die Variable nicht mehr speichern kann.

so sieht's aktuell aus:
For /f "delims=_ tokens=1-$" %%i in ('dir /b /s /a-d *_????.xls ) do echo %i%
Member: Biber
Biber Mar 03, 2007 at 18:01:23 (UTC)
Goto Top
Moin besenwesen,

wir tasten uns da schon ran, keine Sorge...

Dann lass uns bitte erst am CMD-Prompt weiterprobieren, bis wir das gewünschte Ergebnis erhalten.
Am CMD-Prompt (im %Zielverzeichnis%) bitte:
For /f "delims=" %b  in ('dir /b /s /a-d *_????.xls) do For /f "delims=_ tokens=1*" %i in ("%~nb" ) do @echo TestRename "%~dpb\%i_%j" "%i.xls"  

Strategie der zwei FOR-Anweisungen:
- die linke nimmt den vollständugen Dateinamen
- die rechte zerlegt nur den Dateinamen nach dem ersten "_".

Wenn sich da nichts ändert im Ergebnis, poste doch mal die ersten 5 Zeilen einer "Dir /s /b *_????.xls"-Ausgabe.
Dann ist es einfacher.

Gruss
Biber
Member: besenwesen
besenwesen Mar 05, 2007 at 07:30:36 (UTC)
Goto Top
Hallo Biber,

ich bekommen bei der zweiten FOR-Schleife folgenden Fehler:
Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters
ist ungültig: %~nb" ) do @echo TestRename "%~dpb\%i_%j" "%i.xls"  

Geben Sie CALL /? oder FOR /? ein, um herauszufinden, welche Formate gültig
sind.
Syntaxfehler.

Und hier die Liste die ich als Ausgabe bekomme
\..._2007_03\Asab\ma
\..._2007_03\CSB\ma
\..._2007_03\DKK\ma
\..._2007_03\SAP4F&ITNB\ma
\..._2007_03\Sap4fmc\ma
\..._2007_03\SAP4IM\ma
\..._2007_03\Sap4tsbs\ma

Ahcso der Dir-Befehl
For /f "delims=- tokens=1-4" %%i in ('dir /b /a-d /s *-JJMM.xls') do echo %%i


Gruesse
BesenWesen
Member: Biber
Biber Mar 05, 2007 at 07:44:43 (UTC)
Goto Top
Moin Besenwesen,

okay, dann haben wir es jetzt...
Wenn ich als Ternnzeichen das "-" einbaue und die zwei Tippfehler aus meinem letzten Kommantar-Schnipsel verbessere sollte an CMD-Prompt folgendes das gewünschte Ergebnis liefern:
For /f "delims=" %b  in ('dir /b /s /a-d *_????.xls') do For /f "delims=- tokens=1*" %i in ("%~nxb" ) do @echo TestRename "%~dpb\%i_%j" "%i.xls"  

Wenn ja, dann wäre die entsprechende Anweisung im Batch diese:
For /f "delims=" %%b  in ('dir /b /s /a-d *_????.xls') do (  
           For /f "delims=- tokens=1*" %%i in ("%%~nxb" ) do Rename "%%~dpb\%%i_%%j" "%%i.xls"  
)

Gruss
Biber
Member: besenwesen
besenwesen Mar 05, 2007 at 07:54:03 (UTC)
Goto Top
mh,.... leider immer noch nicht...

ich bekomme zwar als Endergebnis den Dateinamen, allerdings immer noch wie o.g. nach dem "ma" abgeschnitten...

Folgende Struktur hat mein Dateiname:
ma-MA-ASAB-JJMM.xls

und ich habe dein Codeschnipsel angepasst:
For /f "delims=" %%b  in ('dir /b /s /a-d *-????.xls') do (  
           For /f "delims=- tokens=1*" %%i in ("%%~nb" ) do echo %%i  
           rem Rename "%%~dpb\%%i_%%j" "%%i.xls"  
) 
Member: Biber
Biber Mar 05, 2007 at 08:08:12 (UTC)
Goto Top
Naja, besenwesen,

dann ist es kein Batchproblem, sondern ein Kommunikationsproblem.

Also: ich war (fälschlicherweise, wie es aussieht) davon ausgegangen, dass die ganze Dateinamens-Prosa nach dem ersten Delimiter "-" entsorgt wird.
In Deinem Beispiel also aus "ma-MA-ASAB-JJMM.xls" wird: "ma.xls".

Aber jetzt gehe ich davon aus, dass aus "ma-MA-ASAB-JJMM.xls" werden soll: "ma-MA-ASAB.xls". Korrekt?

Dann ist in der Tat ein "tokens 1-4" richtig, allerdings sollte dem auch in der DIR-Dateimaske Rechnung getragen werden.
Dann im Batch (zum Testenface-smile
For /f "delims=" %%b  in ('dir /b /s /a-d ??-??-????-????.xls') do (  
           For /f "delims=- tokens=1-4*" %%i in ("%%~nxb" ) do echo NEU: %%i-%%j-%%k.xls  
           Echo Rename "%%~dpb\%%i-%%j-%%k-%%l" "%%i-%%j-%%k.xls"  
)

Gruss Biber
Member: besenwesen
besenwesen Mar 05, 2007 at 08:19:06 (UTC)
Goto Top
Hallo biber,

fast. Ich hab mich wohl falsch ausgedrueckt. Sorry for that!

Ich will den Dateinamen komplett behalten und nur das "JJMM" durch den Inhalt einer Variable erstzen.

so wuerde z.B. aus ma-MA-ASAB-JJMM.xls -> ma-MA-ASAB-0703.xls werden.
Member: Biber
Biber Mar 05, 2007 at 08:37:43 (UTC)
Goto Top
Na, dann passt es doch (fast)....

Wenn Du also irgendwo diese "0703" aus dem "davor" stehenden Pfad herauslesen willst.. das bekämen wir hin.
Aber dann hast Du doch die JJ/MM-Information doch wieder doppelt, oder?
\..._2007_03\SAP4F&ITNB\ma
\..._2007_03\Sap4fmc\ma
\..._2007_03\SAP4IM\ma
\..._2007_03\Sap4tsbs\ma

Das steht doch schon im Ober-Ober-Pfad?

Aber egal, wenn jetzt diese JJMM-Info in einer Variable %JJMM% stünde, dann:
.... Echo Rename "%%~dpb\%%i-%%j-%%k-%%l" "%%i-%%j-%%k-%JJMM%.xls"

Wo soll denn jetzt diese JJMM-Info her kommen? Redundant aus dem "\..._2007_03\" im Ablage-Pfad?

Gruss
Biber
Member: besenwesen
besenwesen Mar 05, 2007 at 09:04:13 (UTC)
Goto Top
Na, dann passt es doch (fast)....

Wenn Du also irgendwo diese "0703"
aus dem "davor" stehenden Pfad
herauslesen willst.. das bekämen wir
hin.
Aber dann hast Du doch die JJ/MM-Information
doch wieder doppelt, oder?
> \..._2007_03\SAP4F&ITNB\ma
> \..._2007_03\Sap4fmc\ma
> \..._2007_03\SAP4IM\ma
> \..._2007_03\Sap4tsbs\ma

Das steht doch schon im Ober-Ober-Pfad?

Der Baum siehr wie folgt aus:

X:\Projektunterlagen\resourcenplanung\02_Rapportzettel_%datum%\

darunter gibt es x projekte:
\SAP4F&ITNB\

\Sap4fmc\

\SAP4IM\

\Sap4tsbs\

...

und in diesen Ordnern liegen dann die .xls-dateien im Format:
ma-MA-ASAB-JJMM.xls

Aber egal, wenn jetzt
diese JJMM-Info in einer Variable %JJMM%
stünde, dann:
> .... Echo Rename
"%%~dpb\%%i-%%j-%%k-%%l"
"%%i-%%j-%%k-%JJMM%.xls"

Wo soll denn jetzt diese JJMM-Info her
kommen? Redundant aus dem
"\..._2007_03\" im Ablage-Pfad?

Gruss
Biber

nein, der Wert steht in der Variablen %jjmm% und wird zu begin aus dem Tagesdatum ermittelt.
Member: Biber
Biber Mar 05, 2007 at 09:29:06 (UTC)
Goto Top
Na, super...
nein, der Wert steht in der Variablen %jjmm% und wird zu begin aus dem Tagesdatum ermittelt.

Dann müssten wir doch jetzt fertig sein, oder gibt der "Echo Rename ....."- Befehl noch nicht das "Richtige" zurück?

Gruss
Biber
Member: besenwesen
besenwesen Mar 05, 2007 at 09:32:06 (UTC)
Goto Top
Na, super...
> nein, der Wert steht in der Variablen
%jjmm% und wird zu begin aus dem Tagesdatum
ermittelt.

Dann müssten wir doch jetzt fertig
sein, oder gibt der "Echo Rename
"- Befehl noch nicht das
"Richtige" zurück?

Gruss
Biber


face-sad nein, leider nicht.

Befehel:
For /f "delims=- tokens=1*" %%i in ("%%~nb" ) do echo Rename "%%~dpb%%i-%%j" "%%i-%%j-%jjmm%.xls"

Ergebnis:
Rename "D:\Projektunterlagen\resourcenplanung\02_Rapportzettel_2007_03\Asab\ma-MA-ASAB-JJMM" "ma-MA-ASAB-JJMM-0703.xls"
Member: besenwesen
besenwesen Mar 05, 2007 at 09:35:10 (UTC)
Goto Top
doch, ich hab's nochmal angepasst, jetzt stimmt zumindest die Ausgabe, aber der
RENAME meckert, dass das system die Datei nicht finden kann.


For /f "delims=- tokens=1-4" %%i in ("%%~nb" ) do Rename "%%~dpb%%i-%%j-%%k-%%l" "%%i-%%j-%%k-%jjmm%.xls"  
Member: Biber
Biber Mar 05, 2007 at 09:44:15 (UTC)
Goto Top
Na ja,

dann halt wie oben gepostet....
Streiche: ....tokens=1-4" %%i in ("%%~nb" ) ....
Setze: tokens=1-4*" %%i in ("%%~nxb" )...

und feddich.. *daumendrück*

Gruss Biber
Member: besenwesen
besenwesen Mar 05, 2007 at 09:46:54 (UTC)
Goto Top
Na ja,

dann halt wie oben gepostet....
Streiche: ....tokens=1-4" %%i in
("%%~nb" ) ....
Setze: tokens=1-4*" %%i in
("%%~nxb" )...

und feddich.. *daumendrück*

Gruss Biber


wow! es funktionier!!!!! VIELEN, VIELEN, VIELEN, VIELEN, VIELEN, DANK fuer deine Zeit und Muehe!!!!!!