Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Ausführlich erklärter Beispielbatch - Datumsattribut geändert am per batch ändern

Anleitung Entwicklung Batch & Shell

Mitglied: Landstreicher

Landstreicher (Level 1) - Jetzt verbinden

17.07.2007, aktualisiert 26.08.2010, 20606 Aufrufe, 9 Kommentare

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.

01.
@echo off 
02.
mkdir "D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten\temp" 
03.
set Quelle="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten" 
04.
set Ziel="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten\temp" 
05.
set Ziel2="D:\SAP_DEL_4\Public\Checklisten\changedate" 
06.
set counter=0 
07.
set maxcount=32 
08.
set counter2=1 
09.
set maxcount2=13 
10.
set Mon=12 
11.
set year=2007 
12.
set revday=%date% 
13.
set revtime=%time% 
14.
time 07:30 
15.
:Run 
16.
 
17.
set /a counter=%counter% + 1 
18.
if "%counter%" EQU "%maxcount%" goto :mon 
19.
 
20.
ping -n 1 localhost >nul 
21.
goto :Runnext 
22.
 
23.
:Runnext 
24.
 
25.
set a=32  
26.
set b=%counter% 
27.
 
28.
set /a gesamt=%a%-%b% 
29.
 
30.
set Day=%gesamt% 
31.
 
32.
if "%Day%"=="1" set Day=01 
33.
if "%Day%"=="2" set Day=02 
34.
if "%Day%"=="3" set Day=03 
35.
if "%Day%"=="4" set Day=04 
36.
if "%Day%"=="5" set Day=05 
37.
if "%Day%"=="6" set Day=06 
38.
if "%Day%"=="7" set Day=07 
39.
if "%Day%"=="8" set Day=08 
40.
if "%Day%"=="9" set Day=09 
41.
if "%Mon%"=="1" set Mon=01 
42.
if "%Mon%"=="2" set Mon=02 
43.
if "%Mon%"=="3" set Mon=03 
44.
if "%Mon%"=="4" set Mon=04 
45.
if "%Mon%"=="5" set Mon=05 
46.
if "%Mon%"=="6" set Mon=06 
47.
if "%Mon%"=="7" set Mon=07 
48.
if "%Mon%"=="8" set Mon=08 
49.
if "%Mon%"=="9" set Mon=09 
50.
 
51.
if exist %Quelle%\DKS_Check_%Day%.%Mon%.%year%.xls echo DKS_Check_%Day%.%Mon%.%year%.xls & goto :set 
52.
 
53.
goto :run 
54.
 
55.
:mon 
56.
set counter=1 
57.
set maxcount=32 
58.
set /a counter2=%counter2% + 1 
59.
if "%counter2%" EQU "%maxcount2%" goto :end 
60.
 
61.
ping -n 1 localhost >nul 
62.
goto :Runnext2 
63.
 
64.
:Runnext2 
65.
 
66.
set c=13  
67.
set d=%counter2% 
68.
 
69.
set /a gesamt2=%c%-%d% 
70.
 
71.
set Mon=%gesamt2% 
72.
 
73.
if "%Day%"=="1" set Day=01 
74.
if "%Day%"=="2" set Day=02 
75.
if "%Day%"=="3" set Day=03 
76.
if "%Day%"=="4" set Day=04 
77.
if "%Day%"=="5" set Day=05 
78.
if "%Day%"=="6" set Day=06 
79.
if "%Day%"=="7" set Day=07 
80.
if "%Day%"=="8" set Day=08 
81.
if "%Day%"=="9" set Day=09 
82.
if "%Mon%"=="1" set Mon=01 
83.
if "%Mon%"=="2" set Mon=02 
84.
if "%Mon%"=="3" set Mon=03 
85.
if "%Mon%"=="4" set Mon=04 
86.
if "%Mon%"=="5" set Mon=05 
87.
if "%Mon%"=="6" set Mon=06 
88.
if "%Mon%"=="7" set Mon=07 
89.
if "%Mon%"=="8" set Mon=08 
90.
if "%Mon%"=="9" set Mon=09 
91.
echo Monat %year%-%Mon% : 
92.
 
93.
 
94.
goto :run 
95.
 
96.
 
97.
 
98.
 
99.
:set 
100.
date %Day%.%Mon%.%year% 
101.
copy %Quelle%\DKS_Check_%Day%.%Mon%.%year%.xls %Ziel% 
102.
move %Ziel%\DKS_Check_%Day%.%Mon%.%year%.xls %Ziel2%  
103.
ping -n 2 172.0.0.1 >nul 
104.
goto :run 
105.
 
106.
 
107.
 
108.
:end 
109.
erase /S /q %Ziel% 
110.
rmdir %Ziel% 
111.
date %revday% 
112.
time %revtime%
vielen dank schonmal vorweg.
Mit freundlichen Grüßen landstreicher
Mitglied: bastla
17.07.2007 um 21:37 Uhr
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
01.
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:
01.
@echo off & setlocal 
02.
set Quelle="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten" 
03.
set Ziel="D:\SAP_DEL_4\Public\Checklisten\changedate" 
04.
if not exist %Ziel% md %Ziel% 
05.
 
06.
set a=32 
07.
set c=13 
08.
set counter=0 
09.
set maxcount=32 
10.
set counter2=1 
11.
set maxcount2=13 
12.
set Mon=12 
13.
set year=2007 
14.
set revday=%date% 
15.
set revtime=%time% 
16.
time 07:30 
17.
pushd %Ziel% 
18.
 
19.
:Run 
20.
set /a counter+=1 
21.
if %counter% EQU %maxcount% goto :mon 
22.
ping -n 1 localhost >nul 
23.
 
24.
set /a gesamt=%a%-%counter% 
25.
set Day=0%gesamt% 
26.
set Day=%Day:~-2% 
27.
 
28.
set Mon=0%Mon% 
29.
set Mon=%Mon:~-2% 
30.
 
31.
if exist %Quelle%\DKS_Check_%Day%.%Mon%.%year%.xls echo DKS_Check_%Day%.%Mon%.%year%.xls & goto :set 
32.
goto :run 
33.
 
34.
:mon 
35.
set counter=1 
36.
set maxcount=32 
37.
set /a counter2+=1 
38.
if %counter2% EQU %maxcount2% goto :end 
39.
ping -n 1 localhost >nul 
40.
 
41.
set /a gesamt2=%c%-%counter2% 
42.
set Mon=0%gesamt2% 
43.
set Mon=%Mon:~-2% 
44.
 
45.
set Day=0%Day% 
46.
set Day=%Day:~-2% 
47.
 
48.
echo Monat %year%-%Mon% : 
49.
goto :run 
50.
 
51.
:set 
52.
date %Day%.%Mon%.%year% 
53.
copy /y %Quelle%\DKS_Check_%Day%.%Mon%.%year%.xls>nul 
54.
copy /b DKS_Check_%Day%.%Mon%.%year%.xls+,,>nul 
55.
ping -n 2 127.0.0.1 >nul 
56.
goto :run 
57.
 
58.
:end 
59.
date %revday% 
60.
time %revtime% 
61.
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]
Bitte warten ..
Mitglied: bastla
17.07.2007 um 21:56 Uhr
... aber zumindest ein wenig kürzer ginge es noch:
01.
@echo off & setlocal 
02.
set Quelle="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten" 
03.
set QDat=DKS_Check_ 
04.
set Ext=xls 
05.
set Ziel="D:\SAP_DEL_4\Public\Checklisten\changedate" 
06.
if not exist %Ziel% md %Ziel% 
07.
 
08.
set revday=%date% 
09.
set revtime=%time% 
10.
time 07:30 
11.
pushd %Ziel% 
12.
 
13.
for %%i in (%Quelle%\%QDat%*.%Ext%) do call :ProcessFile "%%i" 
14.
 
15.
date %revday% 
16.
time %revtime% 
17.
popd 
18.
goto :eof 
19.
 
20.
:ProcessFile 
21.
echo %~1 
22.
set Datum=%~n1 
23.
set Datum=%Datum:~-10% 
24.
date %Datum% 
25.
copy /y %Quelle%\%QDat%%Datum%.%Ext%>nul 
26.
copy /b %QDat%%Datum%.%Ext%+,,>nul
Grüße
bastla
Bitte warten ..
Mitglied: Biber
17.07.2007 um 22:18 Uhr
@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:
01.
@echo off & setlocal 
02.
set Quelle="D:\SAP_DEL_4\Public\Checklisten\Aktuelle_Checklisten" 
03.
set QDat=DKS_Check_ 
04.
<b>set Ext=.xls</b> 
05.
set Ziel="D:\SAP_DEL_4\Public\Checklisten\changedate" 
06.
if not exist %Ziel% md %Ziel% 
07.
 
08.
set revday=%date% 
09.
set revtime=%time% 
10.
time 07:30 
11.
pushd %Ziel% 
12.
 
13.
for %%i in (<b>%Quelle%\%QDat%*%Ext%</b>) do call :ProcessFile "%%i" 
14.
 
15.
date %revday% 
16.
time %revtime% 
17.
popd 
18.
goto :eof 
19.
 
20.
:ProcessFile 
21.
echo %~1 
22.
set Datum=%~n1 
23.
set Datum=%Datum:~-10% 
24.
date %Datum% 
25.
copy /y %Quelle%\%QDat%%Datum%<b>%~x1</b>>nul 
26.
copy /b %QDat%%Datum%<b>%~x1</b>+,,>nul 
27.
goto :eof
Denn der geCALLte Block ":ProcessFile" sollte ja "Files" verarbeiten können... heißt ja nicht ":ProcessExt"...

Grüße
Biber
Bitte warten ..
Mitglied: Landstreicher
18.07.2007 um 11:38 Uhr
Moin Biber & bastla,

jetzt bin ich wie immer baff .... ihr wisst sachen ... ich bin entsetzt

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
Bitte warten ..
Mitglied: bastla
18.07.2007 um 12:02 Uhr
Hallo Landstreicher!

Wie oben erwähnt, kannst Du ein "copy" verwenden, um Datum und Uhrzeit auf den aktuellen Wert zu setzen:
01.
copy /b DKS_Check_%Day%.%Mon%.%year%.xls+,,>nul
Grüße
bastla
Bitte warten ..
Mitglied: Landstreicher
19.07.2007 um 16:31 Uhr
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*

Mit freundlichen Grüßen landstreicher
Bitte warten ..
Mitglied: bastla
19.07.2007 um 17:17 Uhr
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
Bitte warten ..
Mitglied: Biber
20.07.2007 um 00:43 Uhr
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
Bitte warten ..
Mitglied: bastla
20.07.2007 um 10:00 Uhr
@Biber

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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Datum per batch ändern in Tagen (2)

Frage von crawnby zum Thema Batch & Shell ...

IDE & Editoren
gelöst IP und DNS per Batch ändern (9)

Frage von andyw5 zum Thema IDE & Editoren ...

Batch & Shell
gelöst Per Batch FTP-Server Dateien ändern (1)

Frage von Marlon1 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...