zockervogel
Goto Top

Batch nur ausführen wenn in einer definierten Zeit

Hallo,
ich lasse über den Aufgabenplaner von Windows 11 Home zu gewissen Zeiten Programme startet.

Da ab und zu, warum auch immer, der Rechner am Tag neu gestartet hat kam ich auf die Idee diese Programme nach einem solchen ungeplanten Neustart automatisch starten.

Leider bin ich total unwissend im Bereich Batch.

Ich möchte erreichen, dass, wenn die aktuelle Uhrzeit 15 Uhr ist, sollen 4 Programme gestartet werden.
Wenn es allerdings 10 Uhr ist, sollen nur 2 Programme gestartet werden.

Leider funktioniert meine Abfrage nicht.

@echo off
@for /f "Tokens=1,2,3,4 delims=/. " %%a in ('time/t') do set tim=%%a  

echo Zeit ist %tim% Uhr.

if %tim% GTR 8:59 (
	if %tim% LEQ 11:00 (
	echo "Start Programm1"  
	echo "Start Programm2"  
)
if %tim% GTR 10:59 (
	if %tim% LEQ 16:00 (
	echo "Start Programm1"  
	echo "Start Programm2"  
	echo "Start Programm3"  
	echo "Start Programm4"  
	)
)
pause

Es wäre toll, wenn mir jemand sagen kann, wie ich die Abfrage richtig machen muss.

mfg
Peter

Content-ID: 3414831923

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

Ausgedruckt am: 25.11.2024 um 09:11 Uhr

Crusher79
Crusher79 22.07.2022 um 19:42:31 Uhr
Goto Top
Hallo, Powershell hätte ich was. Batch will ich mich jetzt nich reindenken....

Hatte in PS was ähnliches. Wieso aber 8:59 ?

Isolier doch die Stunde. Wenn der Rechner im 24 Std.-Format läuft ist es doch nur 10 oder 15 zum Vergleich. Wenn du mit vollen Zahlen arbeitest ist dass doch ausreichend oder?
Zockervogel
Zockervogel 22.07.2022 um 19:56:16 Uhr
Goto Top
Hallo,
ich wage mich zum erstem mal an eine Batch.

Ich weiß nicht wie ich die Stunden isolieren kann.

Mein Gedanke hier war, die Zeit wird ja auch im Format 19:55 ausgegeben. Aber es kommt mir da nicht auf die Minute an.
Crusher79
Crusher79 22.07.2022 um 20:12:54 Uhr
Goto Top
Batch ist nett um alte Dinge zu warten! Neu würde ich mit Powershell anfangen. Gerade bei neuen Projekten
niewiederit
Lösung niewiederit 22.07.2022 um 20:24:30 Uhr
Goto Top
Nabend,

vielleicht hilft dir das weiter:

@ECHO OFF

IF %time:~0,2%%time:~3,2% GTR 1900 (
ECHO Hallo !
)

PAUSE

IF %time:~0,2%%time:~3,2% LEQ 1900 (
ECHO Hallo NEIN !
) ELSE (
ECHO Hallo ELSE!
)

ECHO Ende !

PAUSE

IF kommt nicht mit dem : Doppelpunkt klar, zumindest nicht bei einem Zahlenvergleich.
Ein STRING-Vergleich könnte funktionieren, aber das wäre unnötig bei diesem Code.

Time kann direkt als Variable verwendet werden.
Mit "%time:~0,2%%time:~3,2%" wird nur der Doppelpunkt entfernt und HHMM ausgegeben.
Die Uhrzeit muss dann natürlich auch ohne Doppelpunkt angegeben werden, also die nach dem Operator.

Anstatt zu verschachteln, könntest du auch einen "ELSE IF" verwenden. Dadurch wird es übersichtlicher, auch wenn dein Code nur kurz ist.

Viele Grüße

Ralf
Zockervogel
Zockervogel 22.07.2022 um 20:24:30 Uhr
Goto Top
wie würde das aussehen ?
Zockervogel
Zockervogel 22.07.2022 um 20:26:21 Uhr
Goto Top
danke Ralf, ich werde das ausprobieren
Zockervogel
Zockervogel 22.07.2022 um 21:03:56 Uhr
Goto Top
Nochmals vielen Dank Ralf, ich habe jetzt einiges neues gelernt.

Klappt alles perfekt.

Peter
niewiederit
niewiederit 22.07.2022 um 21:33:47 Uhr
Goto Top
Freut mich Peter face-smile

Das Time auch eine Variable ist, macht es hierbei einfacher.

Vielleicht kann ja jemand noch ein Powershell-Beispiel beitragen.
Crusher79
Crusher79 23.07.2022 um 09:05:28 Uhr
Goto Top
War eingeschlafen. Irgendwie bin ich durch...

Eigentlcih so. "Add....(x)" kann man weglassen. Hier wurden für andere Aktioinen Minuten, Stunden, Tage abgezogen oder addiert - du kannst auch simpel etwas von der aktuelle Zeit abziehen oder drauf tun.

DayOfWeek = Ergibt den englischen Wochentag
ToString('HH') = Stunden im 24-format. 01, 02 03, .....11, 12, 13

if, elseif - am besten online nachschlagen

Das Verknüpfen ist gewöhnngsbedürftig! Wo woanders ein AND, OR reicht will PS immer ein "minus" davor.

if ($day -eq 'Monday' -and $time -eq '04')

Es ist Montag und die aktuelle Uhrzeit hat irgendwas mit 04 im Stundenanteil.

LEQ bei dir in Batch. EQ wäre gleich. Es gibt auch alle anderen Vergleiche. Am besten googleln.


Wo liegt der unterschied?
Es ist moderner.
Du kannst auch 2 Zeiten als Objekte vergleichen. Statt sich mit Strings und substrahieren auseinander zu setzen lässt scih mit einen Ausdruck in PS auch eine Zeit vergleichen.

Du kannst aus einen Objekt auch nochmehr heraus ziehen.

try() Blöcke lassen alles durchlaufen und Fehler werden abgefangen. Ausgeben, ignorieren, etc.


$day = (Get-Date).AddDays(0).DayOfWeek
$time = (Get-Date).AddHours(0).ToString('HH')  

Add-PSSnapin VeeamPSSnapin

$day = (Get-Date).AddDays(0).DayOfWeek
$time = (Get-Date).AddHours(0).ToString('HH')  

Function Global:DelTape($tapename)
{
$tape = Get-VBRTapeMedium -Name $tapename
Erase-VBRTapeMedium -Medium $tape -Wait
Eject-VBRTapeMedium -Medium $tape
}

Function MoveToPark() {
Get-VBRTapeMedium -MediaPool "Free" |  Where-Object {$_.Name -like "Tape*"} | Foreach-Object {Get-VBRTapeMedium -Name $_.Name | Move-VBRTapeMedium -MediaPool "Park"}  
}

 
if ($day -eq 'Monday' -and $time -eq '04') {   
        DelTape("Tape 1")  
        DelTape("Tape 2")  
        DelTape("Tape 5")  
        DelTape("Tape 6")          
    } elseif ($day -eq 'Tuesday' -and $time -eq '04') {  
        DelTape("Tape 3")  
        DelTape("Tape 4")  
        DelTape("Tape 7")  
        DelTape("Tape 8")          
    } else {
        $day="None"  
    }