landstreicher
Goto Top

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 face-sad

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%
vielen dank schonmal vorweg.
mfg landstreicher

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

bastla
bastla 17.07.2007 um 21:37:50 Uhr
Goto Top
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
copy /b Datei.xls+,,
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:
@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
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]
bastla
bastla 17.07.2007 um 21:56:43 Uhr
Goto Top
... aber zumindest ein wenig kürzer ginge es noch:
@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
Biber
Biber 17.07.2007 um 22:18:06 Uhr
Goto Top
@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:
@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
Landstreicher
Landstreicher 18.07.2007 um 11:38:45 Uhr
Goto Top
Moin Biber & bastla,

jetzt bin ich wie immer baff .... ihr wisst sachen ... ich bin entsetzt face-wink

aber eine kleine frage bleibt mir als noob offen. an welcher stelle setzt du wie das "geändert am" datum um ?

grüße der erstaunte landstreicher
bastla
bastla 18.07.2007 um 12:02:31 Uhr
Goto Top
Hallo Landstreicher!

Wie oben erwähnt, kannst Du ein "copy" verwenden, um Datum und Uhrzeit auf den aktuellen Wert zu setzen:
copy /b DKS_Check_%Day%.%Mon%.%year%.xls+,,>nul

Grüße
bastla
Landstreicher
Landstreicher 19.07.2007 um 16:31:45 Uhr
Goto Top
hi bastla,

kann mir jemand das ganze ab zeile " pushd %Ziel%" etwas näher erklären, was da genau passiert ?
will ja auch nen bissl dabei lernen *g*

mfg landstreicher
bastla
bastla 19.07.2007 um 17:17:24 Uhr
Goto Top
Hallo Landsteicher!

Lerneifer unterstützen wir hier gerne. face-smile

:: 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. face-wink
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
Biber
Biber 20.07.2007 um 00:43:28 Uhr
Goto Top
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
bastla
bastla 20.07.2007 um 10:00:23 Uhr
Goto Top
@Biber

Dankeschön. face-smile
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 ... face-wink

Grüße
bastla