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
GELÖST

Bedingung in Abhängigkeit vom Alter einer Datei

Frage Entwicklung Batch & Shell

Mitglied: cmichel

cmichel (Level 1) - Jetzt verbinden

24.08.2006, aktualisiert 04.09.2006, 7205 Aufrufe, 11 Kommentare

Hi @ all,

Ich hoffe jemand kann mir helfen:
Was ich brauche ist ein dos script, welches das alter einer bestimmten Datei abfragt
und dann in einer Bedingung auf eine bestimmte Position springt.

Wenn Datei älter als 30 min dann gehe dahin ansonsten gehe dorthin

Ich hoffe mal für die DOS Profis hier ist das eine 3min Sache ;)

Mit freundlichen Grüßen
Christof
Mitglied: bastla
27.08.2006 um 20:26 Uhr
Hallo Christof!

Da ich kein DOS-Profi bin kann ich nur eine Lösung per VB-Script anbieten:

01.
'Script ISOLD.vbs 
02.
 
03.
'Erwartete Argumente: Datei, Minuten 
04.
 
05.
'Rückgabe: errorlevel = 0 für Datei ist älter als "Minuten" 
06.
'		  errorlevel = 1 für Datei existiert, ist aber nicht älter als "Minuten" 
07.
'	  	errorlevel = 2 für Fehler; bei Bedarf kann weiter differenziert werden 
08.
'				       (zB fehlende Argumente, Datei nicht gefunden, ... s. u.) 
09.
 
10.
Dim fso, f, mins 
11.
Set fso = CreateObject("Scripting.FileSystemObject") 
12.
If WScript.Arguments.Count <> 2 Then 
13.
	WScript.Quit(2) 'zu wenig Argumente übergeben --> Rückgabe errorlevel 2 
14.
Else 
15.
	f = WScript.Arguments(0) 
16.
	mins = CInt(WScript.Arguments(1)) 
17.
End If 
18.
 
19.
If Not fso.FileExists(f) Then WScript.Quit(2) 
20.
'Datei nicht gefunden --> Rückgabe errorlevel 2 
21.
 
22.
If mins <= 0 Then WScript.Quit(2) 
23.
'Parameterwert für "Minuten" negativ oder 0 --> Rückgabe errorlevel 2 
24.
 
25.
If DateDiff("n", fso.GetFile(f).DateLastModified, Now()) <= mins Then WScript.Quit(1) 
26.
'Datei nicht älter als "Minuten" --> Rückgabe errorlevel 1 
27.
 
28.
'Datei ist "alt" --> "Normales" Script-Ende mit errorlevel 0 
29.
set fso = Nothing

Der folgende Beispielbatch überprüft die Datei "Z:\Test.txt" auf ein Alter von 30 Minuten
(Annahme: Die obige Script-Datei ist als ISOLD.vbs in "C:\Scripts" gespeichert):

01.
CScript //nologo "C:\Scripts\ISOLD.vbs" Z:\test.txt 30 
02.
if errorlevel 2 goto Fehler 
03.
if errorlevel 1 goto jung 
04.
echo alt 
05.
goto Ende 
06.
:Fehler 
07.
echo Fehler! 
08.
goto Ende 
09.
:jung 
10.
echo jung 
11.
:Ende
HTH
bastla
Bitte warten ..
Mitglied: Biber
27.08.2006 um 21:50 Uhr
Moin cMichel,

nur eine Variation des Themas bzw. der Strategie....
Ich würde es ähnlich wie bastla machen, aber den VBS-Teil nur für die reine DateDiff-Ermittlung verwenden - und die Programmlogik (und Variabilität, also die Prüfung auf x Minuten) im Batch lassen.

Mein VBS-Schnipsel sähe sinngemäß so aus:
01.
'----GetFileMinutes.vbs 
02.
Set fso = CreateObject ("Scripting.FileSystemObject")  
03.
Set f = fso.getfile(wscript.arguments(0))  
04.
WScript.echo DateDiff("n", f.DateLastModified, now())  
05.
'------snapp GetFileMinutes.vbs
Der Aufruf wäre entsprechend
CScript //nologo GetFileMinutesvbs DeineDatei.xyz
...und die Rückgabe eine Zahl (geändert von ... Minuten).

Die Auswertung im Batch entsprechend:
01.
for /f %%i in ('cscript //nologo GetfileMinutes.vbs DeineDatei.xyz') do if %%i GEQ 30 Goto IsOlder 
02.
goto :NothingToDo 
03.
.... 
04.
:IsOlder 
05.
....bla.... 
06.
::-----Ende der Skizze
Vorteil ist (für mich), dass ich die drei VBS-Zeilen schnell aus dem Batch heraus mit ECHO erzeugen kann.
Falls nicht das letzte Änderungsdatum das Kriterium ist, sondern das Entstehungsdatum, dann im VBS-Snippet ändern auf f.DateCreated.

Gruß
Biber
Bitte warten ..
Mitglied: cmichel
28.08.2006 um 08:38 Uhr
Hi ihr lieben,

Erstmal Vielen Dank für eure Mühe!
Leider müssen wir VB aussen vor lassen, da alles unter DOS abläuft.
Hintergrund ist das durchsuchen von Festplatten nach Dateienamen in eine txt Datei
Da dies sehr Zeitaufwendig ist brauch dies nicht bei jedem start der batch datei zu erfolgen.

Vielleicht eine andere Idee...
Man speichert die aktuelle Zeit zwischen und wenn 30 min vergangen sind soll er die Festplatten durchsuchen oder ansonsten kann der Teil übersprungen werden.
Vielleicht wäre das unter DOS machbar?

Vielen Dank für die Hilfe!

Gruß
Christof
Bitte warten ..
Mitglied: Biber
28.08.2006 um 09:18 Uhr
Moin Christof,

dann teile uns aber mit, von welchem Betriebssystem wir ausgehen müssen.
Ab Win2k sollte sich auch mit native Batch eine Lösung finden lassen - bei Win95/Win98 wird es sicherlich etwas holzig.

Gruß
Biber
Bitte warten ..
Mitglied: cmichel
03.09.2006 um 09:48 Uhr
Hallo Biber,

Das OS ist WinXP Prof.

Gruß
Christof
Bitte warten ..
Mitglied: Biber
03.09.2006 um 13:18 Uhr
Moin cmichel,

na, ich weiß nicht, ob Du das richtig verstanden hast...
Leider müssen wir VB aussen vor lassen, da alles unter DOS abläuft.
Es geht gar nicht um VB, sondern um VBSkript und überhaupt nicht um DOS, sondern um die CMD.exe

In Bereich "Batch & Shell" steht ein kleines Tutorial zum Thema "Umgang mit Datums- und Zeitvariablen im Batch" mit einer allgemein verwendbaren Datum/Zeit-Aufdrösel-Batchdatei namens GetAllDateTimeInfos.bat.
Diese nutzt aber wiederum vorhandene VBS-Funktionalitäten, alldieweil im Batch keinerlei Datumsberechnungen unterstützt werden.
Und man/frau schlicht und einfach albern wird, wenn es trotzdem über native Batch abgefackelt werden soll.

Das kann ich mit einem Pur-Batch-Schnipsel belegen:
01.
:: --snipp GetFileMinutesDemo.bat Parameter1 Filename/File-Wildcards 
02.
:: Placed in the Public Domain for Educational Purposes Biber 2006 
03.
@echo off & setlocal 
04.
call :DateToDays todayInDays %date%    && REM Heutiges Datum  als Ganzzahl 
05.
call :TimeToMins todaysMinutes %time%  && REM Minuten sei Mitternacht als Ganzzahl 
06.
 
07.
For %%i in (%1) do call :CompareMinutes %%i %todayInDays% %TodaysMinutes% 
08.
goto :eof 
09.
~~~~~~~~~~ Ende des Hauptbatches... es folgen geCALLte Unterroutinen 
10.
:CompareMinutes Parameter1:Datei; Para2: Heute als Ganzzahl; Para3: Minuten heute seit Mitternacht  
11.
For /f "tokens=1-2" %%a in ("%~t1") do ( 
12.
   call :DateToDays FileInDays %%a  && REM DateiDatum als Ganzzahl 
13.
   call :TimeToMins FileMinutes %%b && Rem Datei-Minuten seit Mitternacht 
14.
15.
if %fileinDays% GEQ 25550 (echo [GTR] %~t1 %~f1 ist definitiv nicht aus diesem Jahrhundert) && goto:eof 
16.
REM wenn Jahresendzahl größergleich 70 dann annehmen 1970....1999. [70*365 = 25550] 
17.
Set /a "yesterday=%2-1" 
18.
if %fileinDays% LSS %yesterday% (echo [GTR] %~t1 %~f1 ist definitiv älter als 30 Min) && goto:eof 
19.
if %fileinDays% LSS %2                  Set /a "TodayCompMinutes=%3+(60*24)-30"      
20.
If %fileinDays% LSS %2 if 1%todayCompMinutes% GTR 1%fileMinutes% ( 
21.
    (echo [GTR] %~t1 %~f1: von gestern; älter als 30 Minuten)  && goto :eof 
22.
) else ( 
23.
    (echo [LEQ] %~t1 %~f1: von gestern; jünger als 30 Minuten) && goto :eof 
24.
25.
REM verbleibender Fall: Datei ist von Heute: 
26.
Set /a "FileMinutes+=30" 
27.
If %fileminutes% LSS %3 ( 
28.
   echo [GTR] %~t1 %~f1: von heute; älter als 30 Minuten 
29.
) else ( 
30.
   echo [LSS] %~t1 %~f1: von heute; jünger als 30 Minuten 
31.
)   
32.
goto :eof 
33.
~~~~~~~~~~~ 
34.
:DateToDays ; Para1=Variablenname; Para2 [,Para3] :Datum als "[ttt] TT.MM.[JJ]JJ"  
35.
For %%i in (%2 %3) do set "now=%%i" 
36.
for /f "tokens=1-3 delims=./" %%a in ("%now%") do ( 
37.
      Set /a "%1=((%%c%%100)*365)+((1%%b-100)*12)+(1%%a-100)" ) 
38.
goto :eof 
39.
~~~~~~~~~~ 
40.
:TimeToMins Parameter1: Variablenname Parameter2:Zeit im Format hh:mm 
41.
For /f "tokens=1-2 delims=:" %%a in ("%2") do set /a "%1=(1%%a-100)*60+(1%%b-100)" 
42.
:: ---snapp GetFileMinutesDemo.bat
Wenn ich diesen Schnipsel gegen ein oder mehrere Dateien laufen lasse (um 13:07h!), bekomme ich so etwas am CMD-Prompt:
01.
$cmd$d:\temp\GetFileMinutesDemo.bat *.txt 
02.
[GTR] 04.04.00 23:19  Z:\putinenv.txt ist definitiv älter als 30 Min 
03.
[GTR] 03.09.06 11:37  Z:\vonheute.txt: von heute; älter als 30 Minuten 
04.
[GTR] 02.09.06 18:43  Z:\vongestern.txt: von gestern; älter als 30 Minuten 
05.
[GTR] 03.09.06 12:36  Z:\vonheute2.txt: von heute; älter als 30 Minuten 
06.
 
07.
Z:\> 
08.
$cmd$echo xx>>vonheute2.txt 
09.
 
10.
Z:\> 
11.
$cmd$d:\temp\GetFileMinutesDemo.bat *.txt 
12.
[GTR] 04.04.00 23:19  Z:\putinenv.txt ist definitiv älter als 30 Min 
13.
[GTR] 03.09.06 11:37  Z:\vonheute.txt: von heute; älter als 30 Minuten 
14.
[GTR] 02.09.06 18:43  Z:\vongestern.txt: von gestern; älter als 30 Minuten 
15.
[LSS] 03.09.06 13:07  Z:\vonheute2.txt: von heute; jünger als 30 Minuten
... das heißt, Für jede angefasste/abgefragte Datei bekommst Du eine Zeile mit dem Dateinamen und dem abprüfbaren String "[GTR]", falls die Datei älter als 30 Minuten ist bzw "LSS", wenn die Datei jünger ist als 30 Minuten.

Du kannst also, wie es hier im Forum schon mehrfach vorgehampelt wurde, mit "Find" und Prüfung des Errorlevels Deine Programmlogik steuern.
Beispiel:
01.
d:\temp\GetFileMinutesDemo.bat vonheute2.txt|find "[LSS}" >nul && echo Datei ist jünger als 30 Minuten 
02.
-oder- 
03.
d:\temp\GetFileMinutesDemo.bat vonheute2.txt|find "[LSS}" >nul || echo Datei ist älter als 30 Minuten
Aber dazu findest Du genug Beispiele hier - ich wollte ja nur den Algorithmus skizzieren.

Gruß
Biber
P.S. Ist -wie geschrieben- albern, dieses Rad neu zu erfinden bzw. native Batch hier als Werkzeug zu verwenden.
Für den Rest meiner monatlichen Admin-Aufgaben brauche ich weniger Zeilen.
Bitte warten ..
Mitglied: cmichel
04.09.2006 um 08:08 Uhr
Hallo Biber,

Ja das wird mir auf jeden fall weiterhelfen!
Vielen Dank!

Gruß
Christof
Bitte warten ..
Mitglied: Biber
04.09.2006 um 09:09 Uhr
Moin cmichel,

dennoch, auch wenn ich mich damit wiederholen sollte, halte ich bastla's Ansatz mit Nutzung der DateDiff()-Funktion von VB/JScript für die "richtige" Lösung und habe es entsprechend bewertet.

Ich empfehle Dir dringend noch einmal die Klärung, ob wirklich auf dieses Standardwerkzeug verzichtet werden muss.
Sicherheitsrisiken werden aus meiner Sicht durch die Vorteile kompensiert.
Und, falls Sicherheitsaspekte der Grund gegen VBS gewesen sein sollten:
Eure Rechner könnte ich auch mit native Batch zu mehr oder weniger dekorativen Briefbeschwerern umfunktionieren.
Und wenn ich das könnte, gibt es sicherlich weitere 2 Millionen DAUs mit ausreichender krimineller Energie und Kreativiät.

Bitte setze den Beitrag auf "Gelöst", wenn für Dich keine wesentlichen Fragen mehr offen sind.

Danke
Biber
Bitte warten ..
Mitglied: cmichel
04.09.2006 um 12:53 Uhr
Hi Biber,

Das script habe ich unter date.bat gespeichert.
Ich habe gerade mal versuch die batch mal aufzurufen mit:
date files.txt
Dann kommt bei mir der Hinweis:
Eingegebenes Datum kann nicht übernommen werden.
Geben Sie das neue Datum ein: (TT-MM-JJ)

Was mache ich da falsch?
Gruß
Christof
Bitte warten ..
Mitglied: Biber
04.09.2006 um 13:12 Uhr
Moin cmichel,

das kollidiert mit dem gleichlautenden internen CMD-Befehl "date", der Vorrang hat.

Abhilfe:
a) recommended: Deine *.bat-Datei umbenennen z.B. in Find30MinFiles.bat oder AlleDateienÄlterAlsEineHalbeStundeSuchen.bat oder Karlheinz.bat...
...jedenfalls nicht date.bat

b) nicht empfohlen:
Datei so lassen, wie sie heißt und explizit mit Pfadangabe aufrufen, z.B c:\bätsche\date.bat

Gruß
Biber
Bitte warten ..
Mitglied: cmichel
04.09.2006 um 13:41 Uhr
Hi Biber,

Jo funktioniert!
Vielen Dank für deine Hilfe!!!

Gruß
Christof
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Informationsdienste
gelöst Dienstplan als ics bzw. ical-Datei zur Verfügung stellen (7)

Frage von FreshRawrr zum Thema Informationsdienste ...

Internet
Selbstgehostete B2B Datei-Sharing-Portale wie ProjectSend (3)

Frage von Hannes-Schurig zum Thema Internet ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...