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-ID: 201108

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

Ausgedruckt am: 26.11.2024 um 11:11 Uhr

colinardo
colinardo 01.02.2013 aktualisiert um 10:52:44 Uhr
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
nemofly
nemofly 01.02.2013 um 10:56:40 Uhr
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?
colinardo
colinardo 01.02.2013 aktualisiert um 11:10:28 Uhr
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)   
nemofly
nemofly 01.02.2013 um 11:07:49 Uhr
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 ;)
nemofly
nemofly 01.02.2013 um 11:20:30 Uhr
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.

?
colinardo
colinardo 01.02.2013 aktualisiert um 11:28:36 Uhr
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 
nemofly
nemofly 01.02.2013 um 11:40:52 Uhr
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 ;)
106543
106543 01.02.2013 um 11:48:56 Uhr
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
colinardo
colinardo 01.02.2013 aktualisiert um 11:55:30 Uhr
Goto Top
Bitte den Code mit Codetags( posten damit keine Zeichen im Formatierungsschredder verloren gehen, Merci...
nemofly
nemofly 01.02.2013 aktualisiert um 12:08:56 Uhr
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
colinardo
colinardo 01.02.2013 aktualisiert um 12:32:08 Uhr
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!"
nemofly
nemofly 01.02.2013 um 12:46:24 Uhr
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...
colinardo
colinardo 01.02.2013 um 12:51:29 Uhr
Goto Top
dann prüf doch den schtask Befehl erst mal selber manuell in der Kommandozeile. Wahrscheinlich ist die Firewall eines Servers im Weg
nemofly
nemofly 01.02.2013 um 12:56:37 Uhr
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? ;)
colinardo
colinardo 01.02.2013 um 13:02:03 Uhr
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
nemofly
nemofly 01.02.2013 um 13:07:40 Uhr
Goto Top
Der liegt den dem Verzeichnis: ist das das Root verzeichnis?
C:\WINDOWS\Tasks\xmlreport.job
colinardo
colinardo 01.02.2013 um 13:13:14 Uhr
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
nemofly
nemofly 01.02.2013 um 13:14:59 Uhr
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!!!
nemofly
nemofly 01.02.2013 um 13:16:18 Uhr
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
colinardo
colinardo 01.02.2013 aktualisiert um 13:24:53 Uhr
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...
colinardo
colinardo 01.02.2013 um 13:25:51 Uhr
Goto Top
Mit einem schtasks auf einem XP-System kannst wahrscheinlich keinen Server 2008 abfragen !
nemofly
nemofly 01.02.2013 um 13:38:40 Uhr
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.
nemofly
nemofly 01.02.2013 um 13:41:38 Uhr
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