nemofly
Goto Top

Abfragen, ob ein Schedule Task schon existiert

Hallo,

Ich möchte viele Server abfragen, ob sie schon einen schedule Task haben, der xmlreport heißt...
Außerdem soll falls es einen fehler gibt, also dieser Task auf dem vorhanden Server nicht ist der Schedule Task erstellt werden. Ich möchte nun alle Server in einer .log aufgelistet bekommen, auf denen der Task nicht vorhanden war.
Folgenden Code habe ich schon, aber wie ich noch weiter machen muss weiß ich nicht... :
In Server.txt stehen alle Server drinnen (ca. 200-300)

For /f %%a in (Server.txt) DO (schtasks /query /S %%a | echo %%a if %errorlevel% = 1>> Tasks.log)

Vielen Dank schon mal für jede Hilfe!

Nemofly

Content-Key: 201108

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

Printed on: April 25, 2024 at 22:04 o'clock

Member: colinardo
colinardo Feb 01, 2013 updated at 09:52:44 (UTC)
Goto Top
@echo off & setlocal ENABLEDELAYEDEXPANSION
set TASKNAME=MyTask
set TASKLOG=Tasks.log
for /f "tokens=*" %%a in (Server.txt) DO @(  
  REM Test if Server is online
  ping -n 1 -w 200 %%a | find /c "TTL=" >nul  
  if !ERRORLEVEL! == 1 (
	echo Server '%%a' ist offline >>!TASKLOG!  
  ) else (
       schtasks /query /S %%a /TN "!TASKNAME!"  
       if !errorlevel! == 1 ( 
           echo "Task ist auf Server %%a nicht vorhanden" >>!TASKLOG!  
           REM HIER DEIN SCHTASKS CREATE BEFEHL EINTRAGEN
       )
  )
)

Den Namen des Tasks und den Lognamen noch ergänzen (Zeile 2 und 3)

Grüße Uwe
Member: nemofly
nemofly Feb 01, 2013 at 09:56:40 (UTC)
Goto Top
Bei mir will das nicht so recht klappen...

das ist jetzt mein Kompletter Code:

del C:\Fehler.log
del C:\Tasks.log
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=*" %%a in (Server.txt) DO (schtasks /query /S %%a /TN "xmlreport" if %errorlevel% == 1 (
echo "Task ist auf Server %%a nicht vorhanden" >>Tasks.log))
::REM HIER DEIN SCHTASKS CREATE BEFEHL EINTRAGEN

wenn er dann das @ echo .... ausführen will, dann kommt die meldung: was unexpected at this time.

Was nun?
Member: colinardo
colinardo Feb 01, 2013 updated at 10:10:28 (UTC)
Goto Top
Da ist so einiges Falsch
- du hast das "@" vor dem echo off & setlocal ENABLEDELAYEDEXPANSION vergessen !
- und in der Schleife solltest du die Errorlevel-Variable mit Ausrufezeichen einrahmen !errorlevel! nicht mit %
- und die if-Abfrage in der Schleife hängt ohne & direkt an dem vorigen Befehl.

del C:\Fehler.log
FOR /f %%a in (Server.txt) DO (xcopy /y "D:\Tools\satin\*.*" "\\%%a\c$\hp\hpdiags\" || echo %%a >> Fehler.log)  
del C:\Tasks.log
@echo off & setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=*" %%a in (Server.txt) DO (schtasks /query /S %%a /TN "xmlreport" || echo "Task ist auf Server %%a nicht vorhanden" >>Tasks.log)   
Member: nemofly
nemofly Feb 01, 2013 at 10:07:49 (UTC)
Goto Top
bei der zeile:
for /f "tokens=*" %%a in (Server.txt) DO @(REM Test if Server is online

Folgende Meldung: The Syntax of the command is incorrect.

Vielen dank Trotzdem für deine bisherige hilfe ;)
Member: nemofly
nemofly Feb 01, 2013 at 10:20:30 (UTC)
Goto Top
del C:\Fehler.log
::del C:\Tasks.log
@echo off & setlocal ENABLEDELAYEDEXPANSION
set TASKNAME=xmlreport
set TASKLOG=Tasks.log
for /f "tokens=*" %%a in (Server.txt) DO @(REM Test if Server is online
ping -n 1 -w 200 %%a | find /c "TTL=" >nul
if !ERRORLEVEL! == 1 (
echo Server '%%a' ist offline >>!TASKLOG!
) else (
schtasks /query /S %%a /TN "!TASKNAME!"
if !errorlevel! == 1 (
echo "Task ist auf Server %%a nicht vorhanden" >>!TASKLOG!))
::REM HIER DEIN SCHTASKS CREATE BEFEHL EINTRAGEN

das ist jetzt das Skript, nur leider bleibt es bei @echo off.... hängen Meldung: The Syntax of the command is incorrect.

?
Member: colinardo
colinardo Feb 01, 2013 updated at 10:28:36 (UTC)
Goto Top
so gehört das, und das ganze in die erste Zeile des Scripts !!!
Für Blinde nochmal zum mitlesen:

back-to-top"@"

@echo off & setlocal ENABLEDELAYEDEXPANSION 
Member: nemofly
nemofly Feb 01, 2013 at 10:40:52 (UTC)
Goto Top
So das habe ich jetzt auch alles gemacht, die fehlermeldung bleibt leider trotzdem die gleiche, ich habe mal alles, was funktioniert auskommentiert:

@echo off & setlocal ENABLEDELAYEDEXPANSION
set TASKNAME=xmlreport
set TASKLOG=Tasks.log
::del C:\Fehler.log
::del C:\Tasks.log
for /f "tokens=*" %%a in (Server.txt) DO @(REM Test if Server is online
ping -n 1 -w 200 %%a | find /c "TTL=" >nul
if !ERRORLEVEL! == 1 (
echo Server '%%a' ist offline >>!TASKLOG!
) else (
schtasks /query /S %%a /TN "!TASKNAME!"
if !errorlevel! == 1 (
echo "Task ist auf Server %%a nicht vorhanden" >>!TASKLOG!))
::REM HIER DEIN SCHTASKS CREATE BEFEHL EINTRAGEN


Ich weiß du gibst dir sehr viel mühe danke dir, es wäre sehr nett, wenn wir das hinbekommen könnten ;)
Mitglied: 106543
106543 Feb 01, 2013 at 10:48:56 (UTC)
Goto Top
Hi,

Zitat von @nemofly:
for /f "tokens=*" %%a in (Server.txt) DO @(REM Test if Server is online

Aua das @ vor (REM muss abernicht dahin oder ?

Ich weiß du gibst dir sehr viel mühe danke dir, es wäre sehr nett, wenn wir das hinbekommen könnten ;)

MfG Exzellius
Member: colinardo
colinardo Feb 01, 2013 updated at 10:55:30 (UTC)
Goto Top
Bitte den Code mit Codetags( posten damit keine Zeichen im Formatierungsschredder verloren gehen, Merci...
Member: nemofly
nemofly Feb 01, 2013 updated at 11:08:56 (UTC)
Goto Top
@echo off & setlocal ENABLEDELAYEDEXPANSION
set TASKNAME=xmlreport 
set TASKLOG=Tasks.log
::del C:\Fehler.log
::FOR /f %%a in (Server.txt) DO (xcopy /y "D:\Tools\satin\*.*" "\\%%a\c$\hp\hpdiags\" || echo %%a >> Fehler.log)  
::del C:\Tasks.log
for /f "tokens=*" %%a in (Server.txt) DO @(REM Test if Server is online   
ping -n 1 -w 200 %%a | find /c "TTL=" >nul  
if !ERRORLEVEL! == 1 (
echo Server '%%a' ist offline >>!TASKLOG!  
) else (
schtasks /query /S %%a /TN "!TASKNAME!"  
if !errorlevel! == 1 (
echo "Task ist auf Server %%a nicht vorhanden" >>!TASKLOG!))  
::REM HIER DEIN SCHTASKS CREATE BEFEHL EINTRAGEN
das eine @ vor dem REM habe ich schon weggetan
Member: colinardo
colinardo Feb 01, 2013 updated at 11:32:08 (UTC)
Goto Top
OK Dir fehlt am Ende eine Klammer ")".
Eine Korrektur des Ping Befehls habe ich noch mit reingenommen falls der PC via IPv6 pingt:
Hier die korrigierte Schleife:
for /f "tokens=*" %%a in (Server.txt) DO @(  
	ping -n 1 -w 200 %%a | find /c "Zeit<" >nul  
	if !ERRORLEVEL! == 1 (
		echo Server '%%a' ist offline >>!TASKLOG!  
	) else (
		schtasks /query /S \\%%a /TN "!TASKNAME!"  
		if !errorlevel! == 1 (
			echo "Task ist auf Server %%a nicht vorhanden" >>!TASKLOG!  
		)
	)
)
eventuell musst du für das Remote Abfragen via schtasks noch Benutzername und Kennwort mitgeben...
schtasks /query /S \\%%a /U USERNAME /P KENNWORT /TN "!TASKNAME!"
Member: nemofly
nemofly Feb 01, 2013 at 11:46:24 (UTC)
Goto Top
so er schreibt jetzt was in die Taks.log datei rein, und das mit dem Ping läuft auch super,
habe einen server als test dabei gehabt, der dieses xmlreport schon drauf hat, aber er hat trotzdem in die .log datei geschrieben, das sie dort nicht vorhanden ist.

for /f "tokens=*" %%a in (Server.txt) DO (  
ping -n 1 -w 200 %%a | find /c "TTL=" >nul  
if !ERRORLEVEL! == 1 (
echo Server '%%a' ist offline >>!TASKLOG!  
) else (
schtasks /query /S %%a /U "Test" /P "Test" /TN "!TASKNAME!"  
if !errorlevel! == 1 (
echo "Task ist auf Server %%a nicht vorhanden" >>!TASKLOG! )))  

bei zeile 6 ist es egal ob ich %&a oder \\%%a schreibe, hat auch nichts geholfen...
Member: colinardo
colinardo Feb 01, 2013 at 11:51:29 (UTC)
Goto Top
dann prüf doch den schtask Befehl erst mal selber manuell in der Kommandozeile. Wahrscheinlich ist die Firewall eines Servers im Weg
Member: nemofly
nemofly Feb 01, 2013 at 11:56:37 (UTC)
Goto Top
wenn ich in cmd folgendes eingebe:

schtasks /query /S T01MCHFK77

dann zeigt er mir alle exitierende tasks an, die es auf dem Server gibt.
Also an sich funktioniert das einwandfrei. Also firewall kann es nicht sein.
Hast vllt noch ne andere idee? ;)
Member: colinardo
colinardo Feb 01, 2013 at 12:02:03 (UTC)
Goto Top
Wenn der Task nicht im Root-Verzeichnis des Taskplaners liegt musst du natürlich den Pfad zum Task mit angeben. D.h. Wenn der Task im Ordner MeineTasks liegt sieht die Variable TASKNAME so aus:
set TASKNAME=\MeineTasks\xmlreport
Member: nemofly
nemofly Feb 01, 2013 at 12:07:40 (UTC)
Goto Top
Der liegt den dem Verzeichnis: ist das das Root verzeichnis?
C:\WINDOWS\Tasks\xmlreport.job
Member: colinardo
colinardo Feb 01, 2013 at 12:13:14 (UTC)
Goto Top
neeee, das ist eine Virtuelle Struktur. Welche Windows-Version haben die Server? Ab Server 2008 lassen sich die Tasks in Unterordner einsortieren. Siehe WIN-R taskschd.msc
Member: nemofly
nemofly Feb 01, 2013 at 12:14:59 (UTC)
Goto Top
So habe gerade festgestellt, das es bei schtasks /query den befehl /TN gar nicht gibt, bzw, er ihn nicht als parameter verwenden kann.
Nun eine andere idee, ich könnte ja alle gefunden tasks in eine Textdatei schreiben lassen und die Textdatei filtern lassen danach oder?
Wie würde ein dementsprechender batch Code dafür aussehen, das mir z.B. am schluss in einer Datei nur noch die Server angezeigt werden, auf denen der Scheduel Task nicht existiert?

Danke für deine Hilfe!!!
Member: nemofly
nemofly Feb 01, 2013 at 12:16:18 (UTC)
Goto Top
Zitat von @colinardo:
Welche Windows-Version haben die Server?

So wir haben win 2003 und 2008 R2 aber habe auch auf den 2008 geschaut, da sind die im gleichen pfad
Member: colinardo
colinardo Feb 01, 2013 updated at 12:24:53 (UTC)
Goto Top
Jetzt wirds langsam nervig...
Bei Windows Server 2008 mach folgendes:
Start -> Ausführen -> taskschd.msc eingeben
Jetzt hast du links die Aufgaben Struktur, rechts siehst du die Tasks im jeweiligen Ordner.
Aufgabenplanungsbibliothek ist ROOT. Wenn der Task jetzt rechts im Fenster zu sehen ist, brauchst du keinen Pfad übergeben da schtasks den so findet.

Welche Windows Version hat dein System von wo aus du abfragst ? Das scheint eine ältere schtasks Version zu sein...
Member: colinardo
colinardo Feb 01, 2013 at 12:25:51 (UTC)
Goto Top
Mit einem schtasks auf einem XP-System kannst wahrscheinlich keinen Server 2008 abfragen !
Member: nemofly
nemofly Feb 01, 2013 at 12:38:40 (UTC)
Goto Top
ich habe das ganze von einem windows server 2003 ausgeführt. auf dem Windows server 2008 Liegt der schedule task auch auf der root.
Member: nemofly
nemofly Feb 01, 2013 at 12:41:38 (UTC)
Goto Top
Also wenn ich das ausführe vom 2008 servcer, dann funktioniert es, das ich nach xmlreport filtere:

schtasks /query /S T01MCHFK99 /TN xmlreport