Batch: Prüfen, ob bestimmte Datei vorhanden ist, dann weiter machen

dinoldo

Cadet 4th Year
Registriert
Juni 2017
Beiträge
104
Hallo zusammen,

ich hoffe, ihr könnt mir bitte helfen. Ich habe eine Batchdatei, die ich regelmäßig ausführen muss. Es werden in der Regel die Datei an 21 Standorten kopiert / verteilt. Die Batchdatei beinhaltet nicht die Fehlerbehandlung.

Ich würde gerne vorher überprüfen werden, ob eine bestimmte Datei "File.txt" an jeweiligem Standort existiert. Wenn an allen Standorten die Datei vorhanden ist, erst dann soll die XCOPY Routine ausgeführt werden. Wenn an irgendeinem Standort die Datei "File.txt" nicht existiert bzw. Pfad nicht erreichbar ist, dann soll das Script stoppen / pausieren.

Ich hoffe, dass ich das Problem gut beschrieben habe und ihr mir bitte helfen könnt, die im Code unten zu erweitern.

Herzlichen Dank im Voraus.

Code:
color 17

REM hier käme die prüfroutine

REM "D:\Bodo GmbH\DE-TAL01\File.txt
REM "D:\Bodo GmbH\DE-MOS16\File.txt
REM "D:\Bodo GmbH\DE-SAR43\File.txt
REM "D:\Bodo GmbH\DE-OLD27\File.txt
REM "D:\Bodo GmbH\DE-TOS02\File.txt
REM "D:\Bodo GmbH\DE-SPL02\File.txt
REM "D:\Bodo GmbH\DE-KAK05\File.txt
REM "D:\Bodo GmbH\DE-VAL16\File.txt
REM "D:\Bodo GmbH\DE-BEO01\File.txt
REM "D:\Bodo GmbH\DE-ZAG01\File.txt
REM "D:\Bodo GmbH\DE-LJU01\File.txt
REM "D:\Bodo GmbH\DE-KOP16\File.txt
REM "D:\Bodo GmbH\DE-AMS02\File.txt
REM "D:\Bodo GmbH\DE-SRB03\File.txt
REM "D:\Bodo GmbH\DE-DUB05\File.txt
REM "D:\Bodo GmbH\DE-SRB01\File.txt
REM "D:\Bodo GmbH\DE-ALM10\File.txt
REM "D:\Bodo GmbH\DE-DZE01\File.txt
REM "D:\Bodo GmbH\DE-NEL07\File.txt
REM "D:\Bodo GmbH\DE-SEL05\File.txt
REM "D:\Bodo GmbH\DE-DIN01\File.txt

set Script_Path=%~dp0
set QUELLE=%Script_Path:~0,-1%\20210320
set PFAD=LOGOX\BIN

xcopy "%QUELLE%" "D:\Bodo GmbH\DE-TAL01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-MOS16\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SAR43\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-OLD27\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-TOS02\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SPL02\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-KAK05\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-VAL16\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-BEO01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-ZAG01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-LJU01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-KOP16\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-AMS02\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SRB03\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-DUB05\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SRB01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-ALM10\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-DZE01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-NEL07\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SEL05\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-DIN01\%PFAD%\" /Y /E

Beste Grüße,
Dino
 
  • Gefällt mir
Reaktionen: ragan62
Wie baue ich bitte mehrere Abfragen ein? Erst, wenn ALLE Bedingungen erfüllt sind bzw. an jedem Standort die Datei File.txt existiert, dann soll meine restliche Routine ausgeführt werden.

ich habe wie folgt versucht:

Code:
@echo off
color 2f
chcp 65001
cls

if not exist "D:\Bodo GmbH\DE-TAL01\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-MOS16\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-SAR43\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-OLD27\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-TOS02\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-SPL02\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-KAK05\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-VAL16\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-BEO01\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-ZAG01\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-LJU01\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-KOP16\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-AMS02\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-SRB03\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-DUB05\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-SRB01\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-ALM10\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-DZE01\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-NEL07\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-SEL05\File.txt" GOTO FEHLER_QUELLE
if not exist "D:\Bodo GmbH\DE-DIN01\File.txt" GOTO FEHLER_QUELLE

GOTO START_FILECOPY

:START_FILECOPY
set Script_Path=%~dp0
set QUELLE=%Script_Path:~0,-1%\20210320
set PFAD=LOGOX\BIN

xcopy "%QUELLE%" "D:\Bodo GmbH\DE-TAL01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-MOS16\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SAR43\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-OLD27\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-TOS02\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SPL02\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-KAK05\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-VAL16\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-BEO01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-ZAG01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-LJU01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-KOP16\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-AMS02\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SRB03\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-DUB05\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SRB01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-ALM10\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-DZE01\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-NEL07\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-SEL05\%PFAD%\" /Y /E
xcopy "%QUELLE%" "D:\Bodo GmbH\DE-DIN01\%PFAD%\" /Y /E

GOTO ENDE
:FEHLER_QUELLE
echo Die Datei ... existiert nicht!
pause
exit
:ENDE
echo Die Dateien wurden erfolgreich kopiert!
pause
exit

Das könnte funktionieren, nur hier "Die Datei ... existiert nicht!" würde ich gerne die Datei aufführen wollen, die nicht existiert. Wie mache ich das bitte?
 
dinoldo schrieb:
Wie baue ich bitte mehrere Abfragen ein?

Das hast du schon gemacht. Du prüfst aber, ob an einem Pfad eine Datei nicht existiert. Du willst doch aber wissen, ob sie existiert. Ein else hast du ja nicht drin.

Um die Struktur deiner Batch beizubehalten, müßtest du nach der ersten Prüfung if exist "D:\Bodo GmbH\DE-TAL01\File.txt" mit etwas wie GOTO PRUEFUNG_DE-MOS16\File.txt weitermachen.
 
Hi DeusoftheWired,

ich möchte das Ganze nach Möglichkeit mit wenigen Zeilencode erstellen. Wenn ich mit etwas wie GOTO PRUEFUNG_DE-MOS16\File.txt weitermache, dann muss ich es 21 Mal als GOTO unten im Code erweitern, oder? Welche Variante würdest du bitte bevorzugen?
 
Ich kenne auch nur Batchgrundlagen und es gibt bestimmt auch eine Möglichkeit, das ganze elegant mit dem Abfrühstücken aller 21 Bedingungen, die erfüllt sein müssen, gleichzeitg zu erledigen.

Nach dem hier würde ich sagen, probier mal aus, alle hintereinander zu setzen, also

Code:
if exist "D:\Bodo GmbH\DE-TAL01\File.txt"
if exist "D:\Bodo GmbH\DE-MOS16\File.txt"
if exist "D:\Bodo GmbH\DE-SAR43\File.txt"
if exist "D:\Bodo GmbH\DE-OLD27\File.txt"
if exist "D:\Bodo GmbH\DE-TOS02\File.txt"
if exist "D:\Bodo GmbH\DE-SPL02\File.txt"
if exist "D:\Bodo GmbH\DE-KAK05\File.txt"
if exist "D:\Bodo GmbH\DE-VAL16\File.txt"
if exist "D:\Bodo GmbH\DE-BEO01\File.txt"
if exist "D:\Bodo GmbH\DE-ZAG01\File.txt"
if exist "D:\Bodo GmbH\DE-LJU01\File.txt"
if exist "D:\Bodo GmbH\DE-KOP16\File.txt"
if exist "D:\Bodo GmbH\DE-AMS02\File.txt"
if exist "D:\Bodo GmbH\DE-SRB03\File.txt"
if exist "D:\Bodo GmbH\DE-DUB05\File.txt"
if exist "D:\Bodo GmbH\DE-SRB01\File.txt"
if exist "D:\Bodo GmbH\DE-ALM10\File.txt"
if exist "D:\Bodo GmbH\DE-DZE01\File.txt"
if exist "D:\Bodo GmbH\DE-NEL07\File.txt"
if exist "D:\Bodo GmbH\DE-SEL05\File.txt"
if exist "D:\Bodo GmbH\DE-DIN01\File.txt"
 
Wegen dem wenig Zeilencode : Das könnte man alles in einem schönen übersichtlichen One-liner schreiben ^-^
&& und & wären fürs Abarbeiten der Schlüssel. Siehe

Um die Dateien 1.txt, 2.txt, 3.txt von Ordner1 nach Ordner2 zu bekommen (und nur wenn alle Dateien tatsächlich vorhanden sind) : &&
Wenn dann alle vorhanden sind : xcopy Befehle mit & nach und nach ausführen
Code:
@echo off
if exist "C:\Ordner1\1.txt" (echo "1 da") && if exist "C:\Ordner1\2.txt" (echo "2 da") && if exist "C:\Ordner1\3.txt" (echo "3 da") && xcopy "C:\Ordner1\1.txt" "C:\Ordner2" /Y /E & xcopy "C:\Ordner1\2.txt" "C:\Ordner2" /Y /E & xcopy "C:\Ordner1\3.txt" "C:\Ordner2" /Y /E
pause

Um One-Liner übersichtlicher zu bekommen, können im Code per Zirkumflex/^/Die-Taste-zwischen-Escape-und-Tabulator Zeilenumbrüche gemacht werden:
Code:
@echo off
if exist "C:\Ordner1\1.txt" (echo "1 da") ^
&& ^
if exist "C:\Ordner1\2.txt" (echo "2 da") ^
&& ^
if exist "C:\Ordner1\3.txt" (echo "3 da") ^
&& ^
xcopy "C:\Ordner1\1.txt" "C:\Ordner2" /Y /E & ^
xcopy "C:\Ordner1\2.txt" "C:\Ordner2" /Y /E & ^
xcopy "C:\Ordner1\3.txt" "C:\Ordner2" /Y /E
pause

Jetzt könnte man noch einen Loop einbauen, welcher wartet, daß alle Dateien vollständig vorhanden sind. Sobald alle vorhanden, wird kopiert + das Skript beendet. Ansonsten wartet das Skript ab:
Code:
@echo off
:ANFANG
if exist "C:\Ordner1\1.txt" (echo "1 da") ^
&& ^
if exist "C:\Ordner1\2.txt" (echo "2 da") ^
&& ^
if exist "C:\Ordner1\3.txt" (echo "3 da") ^
&& ^
xcopy "C:\Ordner1\1.txt" "C:\Ordner2" /Y /E & ^
xcopy "C:\Ordner1\2.txt" "C:\Ordner2" /Y /E & ^
xcopy "C:\Ordner1\3.txt" "C:\Ordner2" /Y /E & ^
Exit
GOTO ANFANG

//EDIT:
Und wegen den IF-Anweisungen. Die müsste man ineinander verschachteln: Wenn in der ersten IF-Anweisung Datei1 vorhanden ist, so müsste dann die IF-Anweisung für Datei2 dort hineingeschrieben werden. Dann für die Datei3 in die von Datei2. usw. usw.
Sobald dann die letzte Datei vorhanden ist, dann dort die xcopy-Befehle ausführen:
Code:
@echo off
if exist C:\Ordner1\1.txt (
echo "1 da"
if exist C:\Ordner1\2.txt (
echo "2 da"
if exist C:\Ordner1\3.txt (
echo "3 da"
xcopy "C:\Ordner1\1.txt" "C:\Ordner2" /Y /E
xcopy "C:\Ordner1\2.txt" "C:\Ordner2" /Y /E
xcopy "C:\Ordner1\3.txt" "C:\Ordner2" /Y /E
) else (echo "3 nicht da")
) else (echo "2 nicht da")
) else (echo "1 nicht da")
pause

Und auch hier mit Loop + sobald alle Dateien vorhanden sind (mit kopieren und Exit sobald abgeschlossen):
Code:
@echo off
:ANFANG
if exist C:\Ordner1\1.txt (
echo "1 da"
if exist C:\Ordner1\2.txt (
echo "2 da"
if exist C:\Ordner1\3.txt (
echo "3 da"
xcopy "C:\Ordner1\1.txt" "C:\Ordner2" /Y /E
xcopy "C:\Ordner1\2.txt" "C:\Ordner2" /Y /E
xcopy "C:\Ordner1\3.txt" "C:\Ordner2" /Y /E
EXIT
) else (GOTO ANFANG)
) else (GOTO ANFANG)
) else (GOTO ANFANG)
pause
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: DeusoftheWired und dinoldo
@dinoldo:
Ich beziehe mich auf deinen Code von #4:
Die Zeilen 6-26 -> Speichere die Speicherorte der Dateien (D:\Bodo GmbH\DE-TAL01\File.txt) in eine separate Text-Datei, pro Zeile ein Speicherort, ohne ""-Zeichen.

Danach ersetze Zeile 6-26 mit folgenden Code:
Code:
FOR /F "usebackq delims=" %%i IN ("Text Datei.txt") DO (
    SET Datei=%%i
    IF NOT EXIST "%%i" GOTO :FEHLER_QUELLE
)

In Zeile 59 ersetzt du die Punkte (...) durch "%Datei%"

Das wäre zumindest meine spontane Lösung für das Problem

Und vielleicht fällt dir mit der Hilfe meines Beispiel-Codes noch weiteres Einsparpotential an Codezeilen in #4 auf 😉
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: dinoldo
Zunächst herzlichen Dank für die Lösungen! 👏

@ryan_blackdrago : Ich habe es alles nachvollziehen können. Alles perfekt!👍

@Darkman.X : Die Lösung in einer separaten Datei ist auch sehr interessant, da ich seh viele anderen CMD-Dateien habe, wo ich verweisen kann. Ich habe aber noch drei Fragen, zu deiner Lösung 😇

1. Ist es möglich alle nicht erreichbare Standorte auszugeben? Aktuell wir bei ersten fehlenden pausiert.
2. Wenn eine Location nicht erreicht ist, wird aktuell der Gesamtpfad angezeigt. Lässt sich nur der Teil mit DE-.... (Bsp. DE-KOP16) anzeigen sprich von links aus gesehen, der dritte Teil?
3. Wäre es möglich nach dem fehlenden Standorte angezeigt werden, die Abfrage einzubauen, ob mit allen anderen Standorten (die erreichbar sind) die Aktion trotzdem ausgeführt werden soll?
 
Deine Fragen wären machbar. Aber wie wäre es, wenn du dich in das Thema einarbeitest? Du hast mit der Zeit mehrere Threads zu Problemen mit Batches für deine Arbeit erstellt. Schon aus Eigeninteresse solltest du dich darin einarbeiten.

Ich gebe dir eine Teillösung:

Deine 1. Frage:
Meinen Code in #9 durch folgenden Code ersetzen:
Code:
SETLOCAL ENABLEDELAYEDEXPANSION
SET Zaehler=0
FOR /F "usebackq delims=" %%i IN ("Text Datei.txt") DO (
    IF NOT EXIST "%%i" (
        SET /A Zaehler+=1
        SET Fehlende_Datei[!Zaehler!]=%%i
    )
)
IF %Zaehler% GEQ 1 GOTO :FEHLER_QUELLE

Und weiter unten in deiner Batch dann:
Code:
:FEHLER_QUELLE
ECHO Folgende Dateien fehlen:
FOR /L %%i IN (1,1,%Zaehler%) DO ECHO !Fehlende_Datei[%%i]!

-----------------------------------------------------------------------------------

Deine 2. Frage:
Lese dir die for /?-Hilfe durch und erarbeite dir selber eine Lösung. Oder gehe deine alten Threads durch, weil du diese Frage in ähnlicher Weise schon öfters gestellt hattest.
Tipp: FOR /F ... aus der Hilfe wird dir helfen.

-----------------------------------------------------------------------------------

Deine 3. Frage:
Das würde eine größere Überarbeitung der gesamten Batch erfordern und ich würde es unter anderem mit 2 verschachtelten FOR-Schleifen usw. lösen.
 
Zuletzt bearbeitet: (Code-Zeile 9 korrigiert.)
  • Gefällt mir
Reaktionen: dinoldo
Ich nochmal:

Ich habe im vorherigen Text die Code-Zeile 9 korrigiert, sie hatte einen Fehler 😢

Da du dich per PN so nett bedankt hast, findest du eine Lösung für alle 3 Fragen im Spoiler. Spoiler für den Fall, dass du dir die Lösung selber erarbeiten möchtest 😉

Code:
@echo off
color 2f
chcp 65001
cls

SETLOCAL ENABLEDELAYEDEXPANSION
SET Zaehler=0
FOR /F "usebackq delims=" %%i IN ("Text Datei.txt") DO (
    IF NOT EXIST "%%i" (
        SET /A Zaehler+=1
        FOR /F "tokens=3 delims=\" %%j IN ("%%i") DO (
            SET Fehlende_Dateien[!Zaehler!,1]=%%j
            SET Fehlende_Dateien[!Zaehler!,2]=%%i
        )
    )
)

IF %Zaehler% GEQ 1 (
    ECHO Folgende Dateien/Standorte fehlen:
    FOR /L %%i IN (1,1,%Zaehler%) DO ECHO !Fehlende_Dateien[%%i,1]!
    ECHO.
    CHOICE /N /M "Soll die Kopieraktion mit den vorhandenen Dateien/Standorten durchgeführt werden (J/N)? "
    IF ERRORLEVEL 2 SET Auswahl=NEIN
)

IF "%Auswahl%"=="NEIN" (
    ECHO.
    ECHO Programmabbruch.
    ECHO.
    PAUSE
    GOTO :EOF
)

set Script_Path=%~dp0
set QUELLE=%Script_Path:~0,-1%\20210320
set PFAD=LOGOX\BIN

SET Datei_ueberspringen=FALSE
FOR /F "usebackq delims=" %%i IN ("Text Datei.txt") DO (
    FOR /L %%j IN (1,1,%Zaehler%) DO (
        IF "%%i"=="!Fehlende_Dateien[%%j,2]!" SET Datei_ueberspringen=TRUE
    )
    IF !Datei_ueberspringen!==FALSE xcopy "%QUELLE%" "%%~dpi%PFAD%\" /Y /E
    SET Datei_ueberspringen=FALSE
)

echo Die Dateien wurden erfolgreich kopiert!
pause

Es gibt natürlich mehrere Lösungswege zum Ziel. Ich behaupte nicht, dass der Code perfekt ist. Man könnte z.B. die Zeilen 26-32 direkt in der Zeile 23 mit einbauen. Oder die Zeilen 40-42 könnte man zu einem Einzeiler zusammenfassen. Ich habe es nur für der Lesbarkeit hier im Forum auf einen 3-Zeiler aufgebläht (damit man nicht nach rechts/links scrollen muss).

Ich habe mit Absicht keine Kommentare zum Erklären des Codes gesetzt. Das ist dann deine Aufgabe, den Sinn zu erkennen. 🙂
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: dinoldo
Hi Darkman.X,

vielen Dank! Ich habe es mir angeschaut. Es sieht sehr gut aus. Ich werde es jetzt ein wenig live mit Daten testen. 👍

Wenn ich eine andere Datei nehme z.B. D:\Bodo GmbH\DE-KAK05\Daten\Einstellungen\2021\File.txt nach der die Verfügbarkeit geprüft werden soll, dann passt in diese Zeile die Zusammensetzung nicht überein.

IF !Datei_ueberspringen!==FALSE xcopy "%QUELLE%" "%%~dpi%PFAD%\" /Y /E

Anstatt %~dpi wäre besser den Teil bis zum dritten Backslash sprich D:\Bodo GmbH\DE-KAK05\ zu nehmen.
 
Das ist nicht toll, wenn du plötzlich die Bedingungen änderst ☹️

Code:
@echo off
color 2f
chcp 65001
cls

SETLOCAL ENABLEDELAYEDEXPANSION
SET Zaehler=0
FOR /F "usebackq delims=" %%i IN ("Text Datei.txt") DO (
    IF NOT EXIST "%%i" (
        SET /A Zaehler+=1
        FOR /F "tokens=3 delims=\" %%j IN ("%%i") DO (
            SET Fehlende_Dateien[!Zaehler!,1]=%%j
            SET Fehlende_Dateien[!Zaehler!,2]=%%i
        )
    )
)

IF %Zaehler% GEQ 1 (
    ECHO Folgende Dateien/Standorte fehlen:
    FOR /L %%i IN (1,1,%Zaehler%) DO ECHO !Fehlende_Dateien[%%i,1]!
    ECHO.
    CHOICE /N /M "Soll die Kopieraktion mit den vorhandenen Dateien/Standorten durchgeführt werden (J/N)? "
    IF ERRORLEVEL 2 SET Auswahl=NEIN
)

IF "%Auswahl%"=="NEIN" (
    ECHO.
    ECHO Programmabbruch.
    ECHO.
    PAUSE
    GOTO :EOF
)

set Script_Path=%~dp0
set QUELLE=%Script_Path:~0,-1%\20210320
set PFAD=LOGOX\BIN

SET Datei_ueberspringen=FALSE
FOR /F "usebackq delims=" %%i IN ("Text Datei.txt") DO (
    FOR /L %%j IN (1,1,%Zaehler%) DO (
        IF "%%i"=="!Fehlende_Dateien[%%j,2]!" SET Datei_ueberspringen=TRUE
    )
    IF !Datei_ueberspringen!==FALSE (
        FOR /F "tokens=1-3 delims=\" %%k IN ("%%i") DO SET Ziel=%%k\%%l\%%m
        xcopy "%QUELLE%" "!Ziel!\%PFAD%\" /Y /E
    )
    SET Datei_ueberspringen=FALSE
)

echo Die Dateien wurden erfolgreich kopiert!
pause
 
  • Gefällt mir
Reaktionen: dinoldo
Ich habe auch einige Aufgaben bei mir in der Firma,
bei der ich per Batch prüfen muss, ob Backups von allen Rechnern korrekt gemacht wurden.
Ich habe mir so beholfen, dass ich nach jeder if exist Abfrage einen Zähler hochlaufen lasse.

Beispiel:
set /a count=0
if exist file1.bak set /a count=%count%+1
if exist file1.bak set /a count=%count%+2
if exist file1.bak set /a count=%count%+4
if exist file1.bak set /a count=%count%+8
if exist file1.bak set /a count=%count%+16
if exist file1.bak set /a count=%count%+32
if exist file1.bak set /a count=%count%+64


Am Ende kommt ein Ergebnis raus, welches mir sogar sagen kann, WO was nicht stimmt.
Kommt als Ergebnis zum Beispiel eine 9 raus, dann waren nur das erste und vierte Backup erfolgreich.
Kommt eine 125 raus, dann haben alle Backups geklappt bis auf den zweiten.
Das Ergebnis ist quasi immer eindeutig und man kann entsprechend reagieren.

if %count%==0 goto Fehler0
if %count%==1 goto Fehler1
usw...
 
Ich verwende für so etwas immer Unterroutinen. Das geht auch mit dem CMD ganz gut, benutzt aber kaum jemand, da man z.B. ()-Klammern in echo-Kommandos escapen muss. Wenn man das nicht tut, ist es schwer den Fehler einzugrenzen.

Code:
@echo off
call :CheckFileExist "Hello.txt"
if not %ERRORLEVEL% == 0 exit /b 2
call :CheckFileExist "World.txt"
if not %ERRORLEVEL% == 0 exit /b 2
echo Alle Dateien vorhanden.
exit /b 0

:CheckFileExist
if not exist %1 (
  echo Error:   File ^(%1^) not found.
  exit /b 2
)
exit /b 0
 
Zurück
Oben