Ausführlich erklärter Beispielbatch - Datumsattribut geändert am per batch ändern
Hallo ,
ich habe mal wieder ein Problem!
folgendes...
Ich habe xls Dateien die ich überarbeitet habe, jetzt habe ich mir eine batchdatei geschrieben (mehr gebastelt aber es funktioniert soweit) das problem ist, ich schaffe es nur das erstelldatum damit zu ändern jedoch nicht das geändert am
weiss jemand eventuell eine lösung ? ... ach noch was, es soll in eine batch eingebaut werden.
hier mal die batch, die ich niemanden vorenthalten will.
vielen dank schonmal vorweg.
mfg landstreicher
ich habe mal wieder ein Problem!
folgendes...
Ich habe xls Dateien die ich überarbeitet habe, jetzt habe ich mir eine batchdatei geschrieben (mehr gebastelt aber es funktioniert soweit) das problem ist, ich schaffe es nur das erstelldatum damit zu ändern jedoch nicht das geändert am
weiss jemand eventuell eine lösung ? ... ach noch was, es soll in eine batch eingebaut werden.
hier mal die batch, die ich niemanden vorenthalten will.
@echo off
mkdir "D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten\temp"
set Quelle="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten"
set Ziel="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten\temp"
set Ziel2="D:\SAP_DEL_4\Public\Checklisten\changedate"
set counter=0
set maxcount=32
set counter2=1
set maxcount2=13
set Mon=12
set year=2007
set revday=%date%
set revtime=%time%
time 07:30
:Run
set /a counter=%counter% + 1
if "%counter%" EQU "%maxcount%" goto :mon
ping -n 1 localhost >nul
goto :Runnext
:Runnext
set a=32
set b=%counter%
set /a gesamt=%a%-%b%
set Day=%gesamt%
if "%Day%"=="1" set Day=01
if "%Day%"=="2" set Day=02
if "%Day%"=="3" set Day=03
if "%Day%"=="4" set Day=04
if "%Day%"=="5" set Day=05
if "%Day%"=="6" set Day=06
if "%Day%"=="7" set Day=07
if "%Day%"=="8" set Day=08
if "%Day%"=="9" set Day=09
if "%Mon%"=="1" set Mon=01
if "%Mon%"=="2" set Mon=02
if "%Mon%"=="3" set Mon=03
if "%Mon%"=="4" set Mon=04
if "%Mon%"=="5" set Mon=05
if "%Mon%"=="6" set Mon=06
if "%Mon%"=="7" set Mon=07
if "%Mon%"=="8" set Mon=08
if "%Mon%"=="9" set Mon=09
if exist %Quelle%\DKS_Check_%Day%.%Mon%.%year%.xls echo DKS_Check_%Day%.%Mon%.%year%.xls & goto :set
goto :run
:mon
set counter=1
set maxcount=32
set /a counter2=%counter2% + 1
if "%counter2%" EQU "%maxcount2%" goto :end
ping -n 1 localhost >nul
goto :Runnext2
:Runnext2
set c=13
set d=%counter2%
set /a gesamt2=%c%-%d%
set Mon=%gesamt2%
if "%Day%"=="1" set Day=01
if "%Day%"=="2" set Day=02
if "%Day%"=="3" set Day=03
if "%Day%"=="4" set Day=04
if "%Day%"=="5" set Day=05
if "%Day%"=="6" set Day=06
if "%Day%"=="7" set Day=07
if "%Day%"=="8" set Day=08
if "%Day%"=="9" set Day=09
if "%Mon%"=="1" set Mon=01
if "%Mon%"=="2" set Mon=02
if "%Mon%"=="3" set Mon=03
if "%Mon%"=="4" set Mon=04
if "%Mon%"=="5" set Mon=05
if "%Mon%"=="6" set Mon=06
if "%Mon%"=="7" set Mon=07
if "%Mon%"=="8" set Mon=08
if "%Mon%"=="9" set Mon=09
echo Monat %year%-%Mon% :
goto :run
:set
date %Day%.%Mon%.%year%
copy %Quelle%\DKS_Check_%Day%.%Mon%.%year%.xls %Ziel%
move %Ziel%\DKS_Check_%Day%.%Mon%.%year%.xls %Ziel2%
ping -n 2 172.0.0.1 >nul
goto :run
:end
erase /S /q %Ziel%
rmdir %Ziel%
date %revday%
time %revtime%
mfg landstreicher
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 64014
Url: https://administrator.de/tutorial/ausfuehrlich-erklaerter-beispielbatch-datumsattribut-geaendert-am-per-batch-aendern-64014.html
Ausgedruckt am: 24.12.2024 um 13:12 Uhr
9 Kommentare
Neuester Kommentar
Hallo Landstreicher!
An sich könnte man/frau/kind für ein derartiges Unterfangen auf eines der vielen "touch"-Tools zurückgreifen, aber zur Not geht's auch mit einem
Um sich die Berücksichtigung des Pfades dabei zu ersparen, bietet es sich an, gleich mit einem "pushd" in das gewünschte Verzeichnis zu wechseln. Zusammen mit einigen Straffungen ergibt das mit Deinem Algorithmus in etwa folgenden Batch:
Auf die Pausen mit dem "ping"-Befehl könnte man wohl auch verzichten ...
Feintuning wäre etwa noch hinsichtlich der Berücksichtigung der Sommerzeit möglich, aber wie Biber in solchen Fällen schon mal anmerkt: Ist ja nur ein Batch und kein Satellitensteuerungsprogramm ...
Grüße
bastla
[Edit] copy /b richtiggestellt [/Edit]
An sich könnte man/frau/kind für ein derartiges Unterfangen auf eines der vielen "touch"-Tools zurückgreifen, aber zur Not geht's auch mit einem
copy /b Datei.xls+,,
@echo off & setlocal
set Quelle="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten"
set Ziel="D:\SAP_DEL_4\Public\Checklisten\changedate"
if not exist %Ziel% md %Ziel%
set a=32
set c=13
set counter=0
set maxcount=32
set counter2=1
set maxcount2=13
set Mon=12
set year=2007
set revday=%date%
set revtime=%time%
time 07:30
pushd %Ziel%
:Run
set /a counter+=1
if %counter% EQU %maxcount% goto :mon
ping -n 1 localhost >nul
set /a gesamt=%a%-%counter%
set Day=0%gesamt%
set Day=%Day:~-2%
set Mon=0%Mon%
set Mon=%Mon:~-2%
if exist %Quelle%\DKS_Check_%Day%.%Mon%.%year%.xls echo DKS_Check_%Day%.%Mon%.%year%.xls & goto :set
goto :run
:mon
set counter=1
set maxcount=32
set /a counter2+=1
if %counter2% EQU %maxcount2% goto :end
ping -n 1 localhost >nul
set /a gesamt2=%c%-%counter2%
set Mon=0%gesamt2%
set Mon=%Mon:~-2%
set Day=0%Day%
set Day=%Day:~-2%
echo Monat %year%-%Mon% :
goto :run
:set
date %Day%.%Mon%.%year%
copy /y %Quelle%\DKS_Check_%Day%.%Mon%.%year%.xls>nul
copy /b DKS_Check_%Day%.%Mon%.%year%.xls+,,>nul
ping -n 2 127.0.0.1 >nul
goto :run
:end
date %revday%
time %revtime%
popd
Feintuning wäre etwa noch hinsichtlich der Berücksichtigung der Sommerzeit möglich, aber wie Biber in solchen Fällen schon mal anmerkt: Ist ja nur ein Batch und kein Satellitensteuerungsprogramm ...
Grüße
bastla
[Edit] copy /b richtiggestellt [/Edit]
... aber zumindest ein wenig kürzer ginge es noch:
Grüße
bastla
@echo off & setlocal
set Quelle="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten"
set QDat=DKS_Check_
set Ext=xls
set Ziel="D:\SAP_DEL_4\Public\Checklisten\changedate"
if not exist %Ziel% md %Ziel%
set revday=%date%
set revtime=%time%
time 07:30
pushd %Ziel%
for %%i in (%Quelle%\%QDat%*.%Ext%) do call :ProcessFile "%%i"
date %revday%
time %revtime%
popd
goto :eof
:ProcessFile
echo %~1
set Datum=%~n1
set Datum=%Datum:~-10%
date %Datum%
copy /y %Quelle%\%QDat%%Datum%.%Ext%>nul
copy /b %QDat%%Datum%.%Ext%+,,>nul
Grüße
bastla
@bastla
Ja, aber....
Was das Zitat zum Feintuning betrifft -> keine Einwände.
Aber die im Skript verwendete Variable macht den Batch eher unflexibler als flexibler, was ja der Sinn von dieser Trennung in einmalig definierte Variablen und fest verdrahtete Texte im Code ist.
Vorschlag bzw. ein Schritt hin zur künftigen leichteren Universal-Verwendbarkeit:
Denn der geCALLte Block ":ProcessFile" sollte ja "Files" verarbeiten können... heißt ja nicht ":ProcessExt"...
Grüße
Biber
Ja, aber....
Was das Zitat zum Feintuning betrifft -> keine Einwände.
Aber die im Skript verwendete Variable macht den Batch eher unflexibler als flexibler, was ja der Sinn von dieser Trennung in einmalig definierte Variablen und fest verdrahtete Texte im Code ist.
Vorschlag bzw. ein Schritt hin zur künftigen leichteren Universal-Verwendbarkeit:
@echo off & setlocal
set Quelle="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten"
set QDat=DKS_Check_
<b>set Ext=.xls</b>
set Ziel="D:\SAP_DEL_4\Public\Checklisten\changedate"
if not exist %Ziel% md %Ziel%
set revday=%date%
set revtime=%time%
time 07:30
pushd %Ziel%
for %%i in (<b>%Quelle%\%QDat%*%Ext%</b>) do call :ProcessFile "%%i"
date %revday%
time %revtime%
popd
goto :eof
:ProcessFile
echo %~1
set Datum=%~n1
set Datum=%Datum:~-10%
date %Datum%
copy /y %Quelle%\%QDat%%Datum%<b>%~x1</b>>nul
copy /b %QDat%%Datum%<b>%~x1</b>+,,>nul
goto :eof
Denn der geCALLte Block ":ProcessFile" sollte ja "Files" verarbeiten können... heißt ja nicht ":ProcessExt"...
Grüße
Biber
Hallo Landsteicher!
Lerneifer unterstützen wir hier gerne.
:: In das Zielverzeichnis wechseln (Alternative: "cd /d %Ziel%") ...
pushd %Ziel%
:: Für alle im Quellverzeichnis vorhandenen Dateien, die dem Suchmuster %QDat%*%Ext%,
:: also: "DKS_Check_*.xls", entsprechen, das Unterprogramm "ProcessFile" aufrufen und
:: den Dateinamen als Parameter übergeben ...
for %%i in (%Quelle%\%QDat%*%Ext%) do call :ProcessFile "%%i"
:: Hier sind alle Dateien bearbeitet und daher können wir aufräumen:
:: Datum und Zeit auf die vorher zwischengespeicherten "wirklichen" Werte zurücksetzen,
:: wobei allerdings die 12,37 Sekunden Laufzeit des Batches nicht berücksichtigt werden.
date %revday%
time %revtime%
:: Beim "pushd" wurde das vorhergehende Verzeichnis zwischengespeichert; mit
:: "popd" kehren wir wieder dorthin zurück (was hier zwar egal wäre, da ohnehin
:: schon Ende, aber damit wird diese Rücksprungadresse vom Stack entfernt, daher:
:: pushd und popd immer paarweise verwenden).
popd
:: Beenden mit einem Sprung zur imaginären Marke "eof" (end of file);
:: dass eher "eob" angebracht wäre, interessiert eigentlich keinen ...
goto :eof
:: Hier beginnt das Unterprogramm "ProcessFile", das sich im Prinzip wie ein eigenständiger
:: Batch verhält und daher den übergebenen Dateinamen als Parameter %1 interpretiert.
:ProcessFile
:: Die Schreibweise "%~1" gibt %1 (also den übergebenen Dateinamen inkl. Pfad) ohne die
:: umschließenden Anführungszeichen aus.
echo %~1
:: In %1 steht ein Dateiname, daher kann der reine Namensbestandteil (ohne Extension) mit
:: "%~n1" extrahiert und in eine Variable gespeichert werden (siehe dazu die Hilfe zu "for").
set Datum=%~n1
:: Da in %Datum% jetzt noch der gesamte Dateiname steht, wir aber nur die letzten 10 Stellen
:: brauchen, nehmen wir eben diese und speichern gleich wieder unter dem Namen "Datum".
:: Näheres zur Zerlegung der Variablen findet sich in der Hilfe zu "set".
:: Eigentlich hätte oben der Variablenname "Dateiname" besser gepasst ...
set Datum=%Datum:~-10%
:: Systemdatum für die folgenden Aktionen auf den aus dem Dateinamen extrahierten Wert setzen
date %Datum%
:: Wir befinden uns seit dem "pushd" bereits im Zielverzeichnis, daher benötigt der
:: "copy"-Befehl keine Zielangabe. Das "/y" sorgt dafür, dass bei ev mehrmaligem Aufruf
:: des Batches die schon vorhandene Zieldatei kommentarlos überschrieben wird.
:: ">nul" entsorgt die (hier) uninteressante Meldung "1 Datei(en) kopiert".
:: Der Namensbestandteil "%~x1" gibt die Extension an und bedeutet: Behalte die beim Aufruf
:: übergebene Extension (nach der Dateimaske oben kann dies nur ".xls" sein) bei.
:: Da das Ganze ohnehin nur bei korrektem Namensformat funktioniert, hätte hier
:: sogar ein copy /y %1>nul gereicht ...
copy /y %Quelle%\%QDat%%Datum%%~x1>nul
:: Mit dieser Syntax wird die Datei in sich selbst kopiert, wobei allerdings "Nichts" angefügt
:: und damit die Datei für das System "verändert" wird - daher wird das Änderungsdatum neu
:: gesetzt - der eigentliche Grund für die ganze Aktion.
:: Gleiche Überlegung wie oben: auch ein copy /b %~nx1+, ,>nul müsste genügen ...
copy /b %QDat%%Datum%%~x1+, ,>nul
:: Dieses "goto :eof" steht hier nur der Ordnung halber, da ohnehin schon das Datei-(Batch-)
:: Ende folgt. In dieser Situation bedeutet es: 'Unterprogramm beendet, Rücksprung zum
:: Hauptprogramm (= in die "for"-Schleife, aus der es aufgerufen wurde)'
goto :eof
Grüße
bastla
Lerneifer unterstützen wir hier gerne.
:: In das Zielverzeichnis wechseln (Alternative: "cd /d %Ziel%") ...
pushd %Ziel%
:: Für alle im Quellverzeichnis vorhandenen Dateien, die dem Suchmuster %QDat%*%Ext%,
:: also: "DKS_Check_*.xls", entsprechen, das Unterprogramm "ProcessFile" aufrufen und
:: den Dateinamen als Parameter übergeben ...
for %%i in (%Quelle%\%QDat%*%Ext%) do call :ProcessFile "%%i"
:: Hier sind alle Dateien bearbeitet und daher können wir aufräumen:
:: Datum und Zeit auf die vorher zwischengespeicherten "wirklichen" Werte zurücksetzen,
:: wobei allerdings die 12,37 Sekunden Laufzeit des Batches nicht berücksichtigt werden.
date %revday%
time %revtime%
:: Beim "pushd" wurde das vorhergehende Verzeichnis zwischengespeichert; mit
:: "popd" kehren wir wieder dorthin zurück (was hier zwar egal wäre, da ohnehin
:: schon Ende, aber damit wird diese Rücksprungadresse vom Stack entfernt, daher:
:: pushd und popd immer paarweise verwenden).
popd
:: Beenden mit einem Sprung zur imaginären Marke "eof" (end of file);
:: dass eher "eob" angebracht wäre, interessiert eigentlich keinen ...
goto :eof
:: Hier beginnt das Unterprogramm "ProcessFile", das sich im Prinzip wie ein eigenständiger
:: Batch verhält und daher den übergebenen Dateinamen als Parameter %1 interpretiert.
:ProcessFile
:: Die Schreibweise "%~1" gibt %1 (also den übergebenen Dateinamen inkl. Pfad) ohne die
:: umschließenden Anführungszeichen aus.
echo %~1
:: In %1 steht ein Dateiname, daher kann der reine Namensbestandteil (ohne Extension) mit
:: "%~n1" extrahiert und in eine Variable gespeichert werden (siehe dazu die Hilfe zu "for").
set Datum=%~n1
:: Da in %Datum% jetzt noch der gesamte Dateiname steht, wir aber nur die letzten 10 Stellen
:: brauchen, nehmen wir eben diese und speichern gleich wieder unter dem Namen "Datum".
:: Näheres zur Zerlegung der Variablen findet sich in der Hilfe zu "set".
:: Eigentlich hätte oben der Variablenname "Dateiname" besser gepasst ...
set Datum=%Datum:~-10%
:: Systemdatum für die folgenden Aktionen auf den aus dem Dateinamen extrahierten Wert setzen
date %Datum%
:: Wir befinden uns seit dem "pushd" bereits im Zielverzeichnis, daher benötigt der
:: "copy"-Befehl keine Zielangabe. Das "/y" sorgt dafür, dass bei ev mehrmaligem Aufruf
:: des Batches die schon vorhandene Zieldatei kommentarlos überschrieben wird.
:: ">nul" entsorgt die (hier) uninteressante Meldung "1 Datei(en) kopiert".
:: Der Namensbestandteil "%~x1" gibt die Extension an und bedeutet: Behalte die beim Aufruf
:: übergebene Extension (nach der Dateimaske oben kann dies nur ".xls" sein) bei.
:: Da das Ganze ohnehin nur bei korrektem Namensformat funktioniert, hätte hier
:: sogar ein copy /y %1>nul gereicht ...
copy /y %Quelle%\%QDat%%Datum%%~x1>nul
:: Mit dieser Syntax wird die Datei in sich selbst kopiert, wobei allerdings "Nichts" angefügt
:: und damit die Datei für das System "verändert" wird - daher wird das Änderungsdatum neu
:: gesetzt - der eigentliche Grund für die ganze Aktion.
:: Gleiche Überlegung wie oben: auch ein copy /b %~nx1+, ,>nul müsste genügen ...
copy /b %QDat%%Datum%%~x1+, ,>nul
:: Dieses "goto :eof" steht hier nur der Ordnung halber, da ohnehin schon das Datei-(Batch-)
:: Ende folgt. In dieser Situation bedeutet es: 'Unterprogramm beendet, Rücksprung zum
:: Hauptprogramm (= in die "for"-Schleife, aus der es aufgerufen wurde)'
goto :eof
Grüße
bastla
Moin Bastla,
ich möchte nicht, dass Dein voriger Kommentar im allgemeinen Forumsrauschen untergeht..
Allererste Sahne. Oder was auch immer in der heutigen IT-Welt die zeitgemäße Formulierung ist.
Danke!
@Landstreicher
Bitte sei so lieb und stelle Deinen Nick quasi als Ghostwriter zur Verfügung.
Wenn Du nun aber denken solltest:
"Hääh? ich hab doch nur eine dumme Noob-Frage gestellt und jezz bin ich Tutorial-Schreiber?!?"....
da kann ich Dich beruhigen: nur "gute" Fragen führen im Ergebnis zu solchen Beiträgen.
Also Danke an Euch beide
Biber
ich möchte nicht, dass Dein voriger Kommentar im allgemeinen Forumsrauschen untergeht..
Allererste Sahne. Oder was auch immer in der heutigen IT-Welt die zeitgemäße Formulierung ist.
Danke!
@Landstreicher
Bitte sei so lieb und stelle Deinen Nick quasi als Ghostwriter zur Verfügung.
Wenn Du nun aber denken solltest:
"Hääh? ich hab doch nur eine dumme Noob-Frage gestellt und jezz bin ich Tutorial-Schreiber?!?"....
da kann ich Dich beruhigen: nur "gute" Fragen führen im Ergebnis zu solchen Beiträgen.
Also Danke an Euch beide
Biber
@Biber
Dankeschön.
Lob aus Deiner Tastatur hat einen besonderen Stellenwert.
Grüße
bastla
Dankeschön.
Lob aus Deiner Tastatur hat einen besonderen Stellenwert.
Oder was auch immer in der heutigen IT-Welt die zeitgemäße Formulierung ist.
Weiß ich auch nicht, bin doch von vorgestern ... Grüße
bastla