saschaaaaa
Goto Top

Cmd If ()else(if) geht nicht

Hallo Leute,

ich habe mir ein kleines Script erstellt welches den PC herunterfährt wenn er 90 Minuten im Leerlauf ist UND ein bestimmter Ordner leer ist. Bekomme nun aber immer einen Fehler wenn ich beide Bedingungen erfüllt haben will. Einzeln funktionieren beide...

Es sieht so aus:
@echo off
FOR /F "tokens=5 delims=^ " %%a IN ('quser ^| find ^"^>^"') do @set va=%%a  
FOR /F "tokens=1 delims=^+" %%a IN ("%va%") do @set /A vt=%%a  
FOR /F "tokens=2 delims=^+" %%a IN ("%va%") do @set vg=%%a  
FOR /F "tokens=1 delims=^:" %%a IN ("%vg%") do @set /A vh=%%a  
FOR /F "tokens=2 delims=^:" %%a IN ("%vg%") do @set /A vm=%%a  
set /A vt=%vt%*1440
set /A vh=%vh%*60
set /A idle=%vt%+%vh%+%vm%+90 (Hier wird die Zeit seit einschalten des PC + 90 minuten in eine Variable gesetzt. Normalerweise sollte quser die idle zeit angeben, unter win10 bei mir komischerweise ist es die zeit seit systemstart....)
:mpun
.
. (unerheblich, das kann ich garantieren)
.
for /f %%k IN ('dir "D:\Downloads\extracted\d\VideoQueue" /b /s /A-D ^| find /c /v ""') do @( (Hier springt er raus wenn die untere if %cridle% GTR %idle% drinnen ist, ohne die gehts)  
	if %%k GTR 0 (
		timeout 10
		goto mpun
	) else (
		timeout 30
		for /f %%m IN ('dir "D:\Downloads\extracted\d\VideoQueue" /b /s /A-D ^| find /c /v ""') DO @(  
			FOR /F "tokens=5 delims=^ " %%a IN ('quser ^| find ^"^>^"') do @set va=%%a  
			FOR /F "tokens=1 delims=^+" %%a IN ("%va%") do @set /A vt=%%a  
			FOR /F "tokens=2 delims=^+" %%a IN ("%va%") do @set vg=%%a  
			FOR /F "tokens=1 delims=^:" %%a IN ("%vg%") do @set /A vh=%%a  
			FOR /F "tokens=2 delims=^:" %%a IN ("%vg%") do @set /A vm=%%a  
			set /A vt=%vt%*1440
			set /A vh=%vh%*60
			set /A cridle=%vt%+%vh%+%vm%
			if %%m GTR 0 (
				timeout 10
				goto mpun
			) else (
				if %cridle% GTR %idle% ( ----------------(das hier sorgt für den Fehler, Rausspringen tut er aber oben....)
					shutdown -s -t 0
				) else (
					timeout 10
					goto mpun
				)
			)
		)
	)
)
wenn ich nun in einer batch nur das habe funktioniert es....
if %cridle% GTR %idle%
shutdown -s -t 0
) else (
timeout 10
goto mpun
) (Natürlich werden vorher beide variablen genauso gesetzt wie oben)

Wieso klappt das nicht? hatte auch schon:
) elseif %cridle% GTR %idle% (.....
Das geht auch nicht....

1. Warum klappt das nicht?
2. Warum zeigt quser nicht mehr die leerlaufzeit an (es steht leerlaufzeit dort, ist aber seit systemstart)

Bin dankbar für jeden Tipp

Mit freundlichen Grüßen
Sascha

[Edit Biber] Codeformatierung, weil sonst keine Chance auf sinnvolle Hinweise. [/Edit]

Content-Key: 301514

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

Ausgedruckt am: 28.03.2024 um 22:03 Uhr

Mitglied: rubberman
Lösung rubberman 11.04.2016 um 23:00:52 Uhr
Goto Top
Hallo Sascha,

dein Code ist aufgrund fehlender Codeformatierung und wahllos hineingeschriebener Kommentare unlesbar. Ich vermute folgendes:
Variablen werden in einer Kommandozeile oder in einem, in Klammern eingefassten, Block von Kommandozeilen, nur einmal zum Wert expandiert.
Beispiel:
@echo off &setlocal
set "x=0"  
echo davor: %x%
for /l %%i in (1 1 3) do (
  set "x=%%i"  
  echo im Block: %x%
)
echo danach: %x%
pause
Bei einer Variable, die vor dem Block nicht definiert war, expandiert die Variable zu "nichts", was bei einem Vergleich einen Syntaxfehler auslöst, da dann auf der Seite mit der Variable das == allein steht.
Abhilfe könnte die verzögerte Variablenerweiterung sein.
@echo off &setlocal EnableDelayedExpansion
set "x=0"  
echo davor: %x%
for /l %%i in (1 1 3) do (
  set "x=%%i"  
  echo im Block: !x!
)
echo danach: %x%
pause
Besser wäre aber, gleich mit der FOR Variablen zu arbeiten.

Grüße
rubberman
Mitglied: Saschaaaaa
Saschaaaaa 12.04.2016 um 22:09:12 Uhr
Goto Top
Sorry für die fehlende Formatierung!

Aber danke du hattest Recht.

Zitat von @rubberman:
Bei einer Variable, die vor dem Block nicht definiert war, expandiert die Variable zu "nichts", was bei einem Vergleich einen Syntaxfehler auslöst, da dann auf der Seite mit der Variable das == allein steht.

Die Variable muss vor der For Schleife definiert werden!