mtcmtc
Goto Top

Batch Programmierung (Dateiänderungsdatum-Zeit in Dateinamen anfügen

Hallo zusammen,

ich hoffe hier Hilfe zu finden ...

Folgendes Problem aus einer bereits bestehenden Batchdatei:

Ich möchte von c:\StartVerzeichnis\meineDatei.xlsx nach c:\Zielverzeichnis\meineDatei_Datum_Uhrzeit.xlsx kopieren

Datum und Uhrzeit sollen dem Datum und der Uhrzeit der letzten Speicherung entsprechen, also nicht dem Systemdatum oder -Uhrzeit
Datumsformat soll z. B. 31122021 und Uhrzeitformat 2245 entsprechen
Kopiert wird mit xcopy aus Windows 10 gesetzte Parameter sind /V /-Y

Also ungefähr so:

meineDatei.xlsx hat das Änderungsdatum 31.12.20221 und Änderungszeit 22:45h

Mein Wunsch wäre:
c:\cmd\xcopy.exe c:\StartVerzeichnis\meineDatei.xlsx c:\Zielverzeichnis\meineDatei_31122021__22_45.xlsx /V /-Y

In Euerem Forum habe ich dies gefunden, es für mich angepasst:
for /f "delims=" %%i in ('dir c:\Startverzeichnis\meineDatei.xlsx /s /b /a-d') do call :splitDate %%~ti
und bekomme
31.12.2021 22:45
heraus, aber wie bekomme ich es in den Dateinamen (meineDatei_31122021_2245.xlsx)?

LG Michael

Content-ID: 1748589042

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

Ausgedruckt am: 23.11.2024 um 12:11 Uhr

colinardo
colinardo 22.01.2022 aktualisiert um 14:33:35 Uhr
Goto Top
Servus Michael,
wieso nutzt für so etwas noch Batch? In Powershell ist das schon seit langer Zeit viel weniger Aufwand und klarer aufgebaut:
Get-ChildItem "D:\Quelle" -File -Filter *.xlsx | copy-item -Destination {"D:\Ziel\$($_.Basename)_$($_.LastWriteTime.toString('ddMMyyyy_HH_mm'))$($_.Extension)"} -verbose  
Wenn's warum auch immer doch noch Batch sein muss kannst du bspw. das bemühen
@echo off &setlocal
set "QUELLE=D:\Quelle"  
set "ZIEL=D:\Ziel"  
for %%a in ("%QUELLE%\*.xlsx") do for /f "tokens=1-5 delims=:. " %%b in ("%%~ta") do copy "%%a" "%ZIEL%\%%~na_%%b%%c%%d_%%e_%%f%%~xa"  

Grüße Uwe
mtcmtc
mtcmtc 22.01.2022 aktualisiert um 18:52:35 Uhr
Goto Top
Hallo Uwe,

erst einmal vielen lieben Dank! Funktioniert genau wie ich es wollte!

Du fragtest, warum ich das nicht in der Powershhell mache ...

... weil ich meine Batchdatei (die ich auch schon in der Vergangenheit benutzt hatte) bereits fast fertiggestellt hatte und nicht wieder alles umbauen wollte.

Also, noch einmal vielen Dank!

LG Michael
colinardo
colinardo 22.01.2022 um 18:52:45 Uhr
Goto Top
👍

Grüße Uwe
mtcmtc
mtcmtc 23.01.2022 um 01:45:16 Uhr
Goto Top
Hallo Uwe,

leider hat sich herausgestellt, dass ich in meinem Szenario auch noch die Sekunden brauche ...

Wie und wo müsste ich in der nachfolgenden Zeile etwas ändern/hinzufügen:
for %%a in ("%QUELLE%\*.xlsx") do for /f "tokens=1-5 delims=:. " %%b in ("%%~ta") do copy "%%a" "%ZIEL%\%%~na_%%b%%c%%d_%%e_%%f%%~xa"  

LG Michael
colinardo
colinardo 23.01.2022 aktualisiert um 11:02:48 Uhr
Goto Top
Sekunden bekommst du über den For Loop nicht da Batch keine Zeiten mit Sekundenauflösung bietet, du kannst aber problemlos den o.g. PowerShell Code ergänzt um die Sekunden in deine Batch folgendermaßen einbauen.
@echo off
set "QUELLE=D:\Quelle"  
set "ZIEL=D:\Ziel"  
PowerShell -EP Bypass -NoP -C "Get-ChildItem '%QUELLE%' -File -Filter *.xlsx | copy-item -Destination {\"%ZIEL%\$($_.Basename)_$($_.LastWriteTime.toString('ddMMyyyy_HH_mm_ss'))$($_.Extension)\"} -verbose"  

Wenn du warum auch immer bei "plain" Batch ohne kleine Powershell Hilfe bleiben willst, lässt sich das Änderungsdatum über WMI abfragen, ist aber ehrlich gesagt was Performance angeht unterirdisch, wenn dich das aber nicht stört, bitte:
@echo off &setlocal enabledelayedexpansion
set "QUELLE=D:\Quelle"  
set "ZIEL=D:\Ziel"  
for %%a in ("%QUELLE%\*.xlsx") do (  
    set "filepath=%%a" & set "filepath=!filepath:\=\\!"  
    for /f "tokens=2 delims=.=" %%b in ('wmic path cim_datafile where "name='!filepath!'" get LastModified /value') do (set "dt=%%b" &set "dt=!dt:~6,2!!dt:~4,2!!dt:~0,4!_!dt:~8,2!_!dt:~10,2!_!dt:~12,2!")  
    copy "%%a" "%ZIEL%\%%~na_!dt!%%~xa"  
)
Grüße Uwe
mtcmtc
mtcmtc 23.01.2022 aktualisiert um 12:36:00 Uhr
Goto Top
Zitat von @colinardo:

@echo off &setlocal enabledelayedexpansion
set "QUELLE=D:\Quelle"  
set "ZIEL=D:\Ziel"  
for %%a in ("%QUELLE%\*.xlsx") do (  
    set "filepath=%%a" & set "filepath=!filepath:\=\\!"  
    for /f "tokens=2 delims=.=" %%b in ('wmic path cim_datafile where "name='!filepath!'" get LastModified /value') do (set "dt=%%b" &set "dt=!dt:~6,2!!dt:~4,2!!dt:~0,4!_!dt:~8,2!_!dt:~10,2!_!dt:~12,2!")  
    copy "%%a" "%ZIEL%\%%~na_!dt!%%~xa"  
)
Grüße Uwe


Hallo Uwe,

danke für Deine Hilfe!

Ich habe den Code wie folgt eingefügt:
@echo off &setlocal enabledelayedexpansion
set "QUELLE=c:\meinQuellverzeichnis\"  
set "ZIEL=c:\meinTielverzeichnis\"  
for %%a in ("%QUELLE%\*.xlsx") do (  
    set "filepath=%%a" & set "filepath=!filepath:\=\\!"  
    for /f "tokens=2 delims=.=" %%b in ('wmic path cim_datafile where "name='!filepath!'" get LastModified /value') do (set "dt=%%b" &set "dt=!dt:~6,2!!dt:~4,2!!dt:~0,4!_!dt:~8,2!_!dt:~10,2!_!dt:~12,2!")  
    copy "%%a" "%ZIEL%\%%~na_!dt!%%~xa"  
)
--> Ergebnis ist eine Datei "meineDatei_.xlsx
--> Wunsch "meine Datei_vom_DDMMYYY_um_HHMMSS.xlsx

Als return aus der Batchdatei bekomme ich:
Keine Instanzen verfügbar.
1 Datei(en) kopiert.

Ich muss noch einen Fehler im Code haben ... kannst Du bitte noch einmal einen Blick darauf werden?

LG Michael
colinardo
Lösung colinardo 23.01.2022 aktualisiert um 12:46:51 Uhr
Goto Top
Ich muss noch einen Fehler im Code haben ...
Lass die Backslashes am Ende der Pfadangaben weg, die sind zu viel.
Wunsch "meine Datei_vom_DDMMYYY_um_HHMMSS.xlsx
@echo off &setlocal enabledelayedexpansion
set "QUELLE=c:\meinQuellverzeichnis"  
set "ZIEL=c:\meinZielverzeichnis"  
for %%a in ("%QUELLE%\*.xlsx") do (  
    set "filepath=%%a" & set "filepath=!filepath:\=\\!"  
    for /f "tokens=2 delims=.=" %%b in ('wmic path cim_datafile where "name='!filepath!'" get LastModified /value') do (set "dt=%%b" &set "dt=!dt:~6,2!!dt:~4,2!!dt:~0,4!_um_!dt:~8,2!!dt:~10,2!!dt:~12,2!")  
    copy "%%a" "%ZIEL%\%%~na_vom_!dt!%%~xa"  
)

screenshot
mtcmtc
mtcmtc 23.01.2022 um 12:54:51 Uhr
Goto Top
Yeah, perfekt ... das war es!!!

Vielen Dank und LG ... Michael