@echo off setlocal enabledelayedexpansion :: === Debug-Log === set "DEBUGLOG=C:\Users\PROCADADM\debug_log.txt" echo === Debug-Log gestartet am %date% %time% === > "%DEBUGLOG%" :: === Eingaben === set "INPUTFILE=\\shdata1\MS-Direc\Einkauf_Zeichnungen\Materialnummern.txt" set "SERVER=SHCOM3" set "DATABASE=profile" set "OUTPUT=C:\Users\PROCADADM\dokumenten_ids.txt" set "PDFSOURCE=\\shcad2\D$\prodata\CAD" set "DEST=C:\Users\PROCADADM\Gefundene_Dateien" echo [INFO] Startet Prozess... echo [INFO] Startet Prozess... >> "%DEBUGLOG%" echo. :: === Zielordner vorbereiten === if exist "%DEST%\PDFs" rmdir /S /Q "%DEST%\PDFs" if exist "%DEST%\STPs" rmdir /S /Q "%DEST%\STPs" if exist "%DEST%\tmp" rmdir /S /Q "%DEST%\tmp" mkdir "%DEST%\PDFs" mkdir "%DEST%\STPs" mkdir "%DEST%\tmp" :: === Materialnummern in kommaseparierte Liste packen === echo [INFO] Materialnummern werden aus %INPUTFILE% gelesen... echo [INFO] Materialnummern werden aus %INPUTFILE% gelesen... >> "%DEBUGLOG%" set "MATLIST=" for /f "usebackq delims=" %%a in ("%INPUTFILE%") do ( set "MAT=%%a" if defined MATLIST ( set "MATLIST=!MATLIST!,'!MAT!'" ) else ( set "MATLIST='!MAT!'" ) ) echo [INFO] Fertig. Materialnummern-Liste: !MATLIST! echo [INFO] Fertig. Materialnummern-Liste: !MATLIST! >> "%DEBUGLOG%" echo. :: === SQL-Abfrage ausführen === echo [INFO] Starte SQL-Abfrage... echo [INFO] Starte SQL-Abfrage... >> "%DEBUGLOG%" sqlcmd -S %SERVER% -d %DATABASE% -E -h -1 -W -Q "SET NOCOUNT ON; SELECT v.DV_VSTL25, v.DV_IDNR FROM dbo.DOKVAR v JOIN dbo.DOKSTAMM s ON v.DV_IDNR = s.DO_IDNR WHERE v.DV_VSTL25 IN (!MATLIST!) AND s.DO_EXT IN ('pdf','stp');" -o "%OUTPUT%" echo [INFO] SQL-Abfrage abgeschlossen. Ergebnisse in: %OUTPUT% echo [INFO] SQL-Abfrage abgeschlossen. Ergebnisse in: %OUTPUT% >> "%DEBUGLOG%" echo. echo =============================================== echo Inhalt von %OUTPUT% echo =============================================== type "%OUTPUT%" type "%OUTPUT%" >> "%DEBUGLOG%" echo =============================================== echo. pause :: --- Erste Pause: SQL-Ausgabe prüfen :: === Alle PDFs und STPs auflisten in lokalem TMP-Ordner === dir /b /s "%PDFSOURCE%\*.pdf" > "%DEST%\tmp\all_pdfs.txt" dir /b /s "%PDFSOURCE%\*.stp" > "%DEST%\tmp\all_stps.txt" :: === Dateien suchen und kopieren === echo [INFO] Suche nach passenden Dateien anhand der DOCIDs... echo [INFO] Suche nach passenden Dateien anhand der DOCIDs... >> "%DEBUGLOG%" for /f "tokens=1,2" %%a in (%OUTPUT%) do ( set "MATNR=%%a" set "DOCID=" if "%%b" NEQ "" set "DOCID=%%b" set "FOUND=0" echo [DEBUG] Bearbeite Materialnummer=!MATNR! mit DOCID=!DOCID! echo [DEBUG] Bearbeite Materialnummer=!MATNR! mit DOCID=!DOCID! >> "%DEBUGLOG%" :: Wenn keine DOCID vorhanden ist, überspringen if not defined DOCID ( echo [WARN] Keine DOCID vorhanden für !MATNR! → Überspringe... echo [WARN] Keine DOCID vorhanden für !MATNR! → Überspringe... >> "%DEBUGLOG%" goto :continueLoop ) :: === PDF-Dateien === for /f "delims=" %%f in ('findstr /i "\\!DOCID!.pdf$" "%DEST%\tmp\all_pdfs.txt"') do ( set "FNAME=%%~nxf" if /i "!FNAME!"=="!DOCID!.pdf" ( copy /Y "%%f" "%DEST%\PDFs\!MATNR!.pdf" >nul set "FOUND=1" ) ) :: === STP-Dateien === for /f "delims=" %%f in ('findstr /i "\\!DOCID!.stp$" "%DEST%\tmp\all_stps.txt"') do ( set "FNAME=%%~nxf" if /i "!FNAME!"=="!DOCID!.stp" ( copy /Y "%%f" "%DEST%\STPs\!MATNR!.stp" >nul set "FOUND=1" ) ) if !FOUND! EQU 0 ( echo [WARN] Keine Datei gefunden für DOCID !DOCID! (Materialnummer !MATNR!) echo [WARN] Keine Datei gefunden für DOCID !DOCID! (Materialnummer !MATNR!) >> "%DEBUGLOG%" ) :continueLoop ) pause :: --- Zweite Pause: letzte Kontrolle vor Aufräumen :: === Aufräumen === if exist "%OUTPUT%" del "%OUTPUT%" if exist "%DEST%\tmp" rmdir /S /Q "%DEST%\tmp" type nul > "%INPUTFILE%" :: === Marker auf Server setzen === echo done > "%DEST%\EXPORT_DONE.txt" :: === Dateien auf Netzwerk kopieren === robocopy "%DEST%" "\\shdata1\MS-Direc\Einkauf_Zeichnungen\Gefundene_Dateien" /E /Z :: === Lokalen Ordner löschen === rmdir /S /Q "%DEST%" echo [INFO] Export abgeschlossen. echo [INFO] Export abgeschlossen. >> "%DEBUGLOG%" pause :: --- Letzte Pause, damit Fenster offen bleibt exit