bredack
Goto Top

Callbatch für mehrere andere Batchdateien in verschiedenen Ordnern

Hiho Leude, ma wieder ne Frage face-smile

Ich hab mehrer Batchdateien in unterschiedlichen ordnern auf ner Festplatte und diese sollen nacheinander aufgerufen und abgerabeitet werden.

Hab es schon versucht mit "Call", aber das funktioniert nicht, da die Batchdateien in den jeweiligen Ordnern ausgeführt werden müssen und die somit an anderer Stelle nicht funktionieren.

Desweiteren hab ich es einfach versucht in den Ordner zu gehen und da die Datei aufzurufen, nur wird dann nur die Erste Batch abgearbeitet und dannach is Ende, egal was da kommt.

Ordnerbsp:

H:\Ordner1\Ordner2\Ordner3\batch1
H:\Ordner4\Ordner5\Ordner6\batch2

diese sollen halt ausgeführt werden.

Content-Key: 87479

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

Ausgedruckt am: 28.03.2024 um 22:03 Uhr

Mitglied: bastla
bastla 13.05.2008 um 12:09:39 Uhr
Goto Top
Hallo Bredack!

... da die Batchdateien in den jeweiligen Ordnern ausgeführt werden müssen und die somit an anderer Stelle nicht funktionieren.
Einmal abgesehen davon, dass diese Batchdateien dann vermutlich noch Optimierungspotenzial haben face-wink, kannst Du den Aufruf etwa so gestalten:
pushd H:\Ordner1\Ordner2\Ordner3\
call batch1
popd
...

[Edit] ... oder etwas schlanker:
pushd H:\Ordner1\Ordner2\Ordner3\ & call batch1 & popd
...
[/Edit]

Grüße
bastla
Mitglied: Bredack
Bredack 13.05.2008 um 12:17:16 Uhr
Goto Top
Auf jeden fall haben die Dateien noch optimierungspotential :D

vlt kannst mir auch nen tip geben zum Optimieren, denke ma es liegt an der Lokalabhängigkeit an der Zeile:
for /F "delims=- tokens=1-2*" %%i in ('dir /b %Filter%') do (...  
(dürfte dir bekannt vorkommen ;))
Denke mal, dass es an dem 'dir' liegt, aber wie kann ich da denn genau den Pfad angeben, wo "gesucht" werden soll, mit den dazugehörigen Parametern?

Ansonsten funktioniert das mit dem Call perfekt, danke bastla face-smile

MfG Bredack
Mitglied: Biber
Biber 13.05.2008 um 12:18:30 Uhr
Goto Top
Moin Bredack,

... da die Batchdateien in den jeweiligen Ordnern ausgeführt werden müssen und die somit an anderer Stelle nicht funktionieren.
Wenn eine derartige Restriktion besteht, dann sollte jede dieser Batchdateien als zweite Zeile ein Pushd "dahinWoDieBatLiegt"und als (logisch) vorletzte Zeile ein PopD beinhalten.
Unabhängig davon, ob Du die direkt oder indirekt aufrufst.
@echo off  & setlocal
PushD "%~dp0"  
.....

...
Popd

Grüße
Biber
Mitglied: bastla
bastla 13.05.2008 um 12:24:52 Uhr
Goto Top
Hallo Bredack!

Du hast ja schon (im angesprochenen Batch) eine Variable %path% - setz diese (oder, falls ein anderer Pfad gefragt wäre, eine weitere Variable) einfach so ein:
for /F "delims=- tokens=1-2*" %%i in ('dir /b %path%\%Filter%') do (...  

Eine allgemeinere Lösung kannst Du Biber's Vorschlag entnehmen ...

Noch besser wäre es aber vermutlich, nur einen Batch zu verwenden und diesen jeweils mit dem zu bearbeitenden Ordner als Parameter aufzurufen.

Vielleicht erklärst Du Dein Vorhaben noch einmal etwas genauer ...

Grüße
bastla
Mitglied: Bredack
Bredack 13.05.2008 um 12:35:47 Uhr
Goto Top
Zu meinem Vorhaben nochmal genauer:
Eigentlich war die Aufgabe nur so, dass ich aus einem Ordner Dateien nach Datum auslese und diese halt mit dem Dateinamen "2006_12_23_bla.pdf" in einen Ordner packe, den ich erstelle mit "2006_12" beispielsweise. Hat auch alles recht gut geklappt, bis ich halt erfahren hab, dass es mehrer Ordner sind, auf die das angewendet werden sollte und ich aber beim 1. Batch halt nur in dem eigentlichen Ordner gearbeitet hab. Somit hab ich halt die Dateien verteilt und an die Ordner angepasst.

Aber der Vorschlag von Biber klingt einfacher und Plausibler :D
Werd ich mal testen, ob das die Sache einfacher macht.
Auch der VOrschlag von Bastla is nen Test wert ;)

MfG Bredack

Edit:

Huch, nebenbei bin ich auf was "lustiges" gestoßen, es gibt da nen Ordner mit Umlauten, zb "Überschuss"
Auf den kann ich aber nicht zugreifen, weil das "Ü" nicht erkannt wird und somit der Pfad ungültig ist, gibt es da zufällig auch ne kleine Problemlösung? face-smile

Edit Edit:
la la la :D
Man kann natürlich mit den Umlauten auf die Nase fallen, wenn man den ANSI Zeichensatz nimmt, aber DOS den ASCII Zeichensatz will, somit funktioniert das jetzt face-smile
Mfg Bredack
Mitglied: bastla
bastla 13.05.2008 um 18:09:54 Uhr
Goto Top
Hallo Bredack!

Eigentlich müsste dieser Alternativ-Vorschlag für die aufzurufende Batchdatei noch in Deinen vorigen Thread:
@echo off & setlocal
set "Pfad=%~1"  
set "Filter=%Pfad%\20??_*.txt"  

for /f "skip=1 tokens=1-2* delims=_" %%i in ('dir /b /o-d /a-d "%Filter%"') do xcopy "%%i_%%j_%%k" "%Pfad%\%%i_%%j\">nul  
Wenn Du nicht kopieren, sondern doch verschieben willst:
@echo off & setlocal
set "Pfad=%~1"  
set "Filter=%Pfad%\20??_*.txt"  

for /f "skip=1 tokens=1-2* delims=_" %%i in ('dir /b /o-d /a-d "%Filter%"') do (  
    if not exist "%Pfad%\%%i_%%j\" md "%Pfad%\%%i_%%j\"  
    move "%%i_%%j_%%k" "%Pfad%\%%i_%%j\"  
)
In beiden Fällen wird die neueste Datei durch die umgekehrte Sortierung und das "skip=1" einfach übersprungen.

Beim Aufruf der Batchdatei ist der Quellpfad (ohne abschließenden "\", vor allem, wenn es sich um einen Root-Ordner wie etwa "H:\" handelt) zu übergeben. Falls Du den Batch als "C:\Scripts\Verschiebe.cmd" speicherst, könntest Du diesen so starten:
C:\Scripts\Verschiebe.cmd "H:\Ordner1\Ordner2\Ordner3"  
Der Ordner "Jahr_Monat" wird dabei immer unterhalb des Quellpfades (also im obigen Beispiel als "H:\Ordner1\Ordner2\Ordner3\2008_05") angelegt.
Zurück zum Thema dieses Threads face-wink:
Für eine ganze Liste zu bearbeitender Ordner böte es sich an, eine entsprechende Textdatei (zB "D:\Ordnerliste.txt") mit je einem Pfad pro Zeile zu erstellen und so abzuhandeln:
@echo off & setlocal
set "Liste=D:\Ordnerliste.txt"  

for /f "usebackq delims=" %%a in ("%Liste%") do call :ProcessLine "%%a"  
goto :eof

:ProcessLine
set "Pfad=%~1"  
set "Filter=%Pfad%\20??_*.txt"  

for /f "skip=1 tokens=1-2* delims=_" %%i in ('dir /b /o-d /a-d "%Filter%"') do (  
    if not exist "%Pfad%\%%i_%%j\" md "%Pfad%\%%i_%%j\"  
    move "%%i_%%j_%%k" "%Pfad%\%%i_%%j\"  
)
goto :eof

Grüße
bastla
Mitglied: Bredack
Bredack 14.05.2008 um 09:01:59 Uhr
Goto Top
Eigentlich klappt alles soweit ganz gut, hab halt die Lösung von Biber genommen.
Aufrufen mit Parameterübergabe geht nicht so leicht, da die Filternamen immer anders sind...
Warum kann man nich Dateinamen in Verschiedenen Ordnern einfach einheitlich machen, aber naja, kann ich nix ändern und so gehts ja schon recht gut.

Nur hat sich jetzt ein neues Problem gezeigt, nämlich, dass teilweise die Dateinamen zu lang sind und somit ne Meldung ausgeworfen wird, kann man das irgendwie umgehen?
Wie gesagt, an den Ordnern und Dateinamen kann ich nix ändernface-smile
Danke für die Hilfe bisher face-smile

MfG Bredack
Mitglied: bastla
bastla 14.05.2008 um 12:26:27 Uhr
Goto Top
Hallo Bredack!

Aufrufen mit Parameterübergabe geht nicht so leicht, da die Filternamen immer anders sind...
Ließe sich lösen, indem Du Pfad samt Filter (zB "H:\Ordner1\Ordner2\Ordner3\20??_*.pdf") in die Textdatei schreibst:
@echo off & setlocal
set "Liste=D:\Ordnerliste.txt"  

for /f "usebackq delims=" %%a in ("%Liste%") do call :ProcessLine "%%a"  
goto :eof

:ProcessLine
set "Pfad=%~dp1"  
set "Filter=%~1"  

for /f "skip=1 tokens=1-2* delims=_" %%i in ('dir /b /o-d /a-d "%Filter%"') do (  
    if not exist "%Pfad%%%i_%%j\" md "%Pfad%%%i_%%j\"  
    move "%%i_%%j_%%k" "%Pfad%%%i_%%j\"  
)
goto :eof

... Dateinamen zu lang sind und somit ne Meldung ausgeworfen wird, kann man das irgendwie umgehen?
Ne Meldung zu umgehen ist etwas schwierig, bei einer konkreten Fehlermeldung (und der exakten Beschreibung, unter welchen Umständen / für welchen Dateinamen der Fehler auftritt) ließe sich eher etwas machen ...

Grüße
bastla
Mitglied: Bredack
Bredack 14.05.2008 um 14:03:41 Uhr
Goto Top
> ... Dateinamen zu lang sind und somit
ne Meldung ausgeworfen wird, kann man das
irgendwie umgehen?
Ne Meldung zu umgehen ist
etwas schwierig, bei einer konkreten
Fehlermeldung (und der exakten Beschreibung,
unter welchen Umständen / für
welchen Dateinamen der Fehler auftritt)
ließe sich eher etwas machen ...

Grüße
bastla


Ja ne, es kommt halt die Meldung, dass entweder der Dateiname oder die Erweiterung zu lang ist.
Und meinte halt, dass man das umgehn kann, dass trotzdem die langen Dateinamen genommen werden, bzw vearbeitet werden können. (Somit würde ja auch die Fehlermeldung verschwinden)
Möchte ja halt nur lange Dateinamen (notgedrungen) benutzen^^

MfG Bredack
Mitglied: bastla
bastla 14.05.2008 um 14:20:54 Uhr
Goto Top
Hallo Bredack!

Manchmal drücke ich mich ja wirklich missverständlich aus, daher neuer Versuch:

  • Wie lautet die exakte Fehlermeldung (auch aus der CMD-Shell kann man/frau Text kopieren)?
  • Bei welcher Datei tritt der Fehler auf?
  • Und, zur Sicherheit: Wie sieht der aktuelle Stand Deines Batches aus?

Was Du auch gleich noch machen könntest: Ändere das "echo off" in der ersten Zeile auf "echo on" und starte den Batch von der Kommandozeile mit Umleitung der Ausgabe in eine Textdatei, also zB mit
H:\Ordner1\Ordner2\Ordner3\Verschiebe.cmd>D:\Verschiebe-Log.txt 2>&1
In der so entstandenen Textdatei kannst Du dann den Ablauf samt Fehlermeldungen nachvollziehen und so das Problem hoffentlich noch etwas eingrenzen.

Grüße
bastla
Mitglied: Bredack
Bredack 14.05.2008 um 14:33:06 Uhr
Goto Top
Hiho

Der aktuelle Stand der Batch ist so, dass ich mit der Callbatch die einzelnen Batches in den Ordner nacheinander aufrufe, was auch super klappt.
Aber sobald die Dateinamen etwas länger sind zb: "Yield_nurZK_Detail_2008-02-18-05-58-29" kommt die Fehlermeldung: "Der Dateiname oder die Erweiterung ist zu lang." wenn ich die Dateien in die gewünschten und vorher erstellten Ordner verschieben möchte.
Die Option, dass die Batches mit Parametern aufgerufen werden hab ich erstmal noch nicht implementiert (sry bastlaface-smile ) , da ich wieder andere Dinge machen muss -.-
Aber feintuning werd ich auf jeden fall noch demnächst betreiben mit euren Vorschlägen.

Und Sry, drücke mich auch manchmal nen bissel missverständlich aus face-smile
MfG Bredack