donsm00chy
Goto Top

schtasks.exe - Abfrage eingestellter Tasks und Rückgabe ob vorhanden

In Anlehnung an mein älteres Problem schließt sich nun ein Weiteres an.

Grob gesagt geht es jetzt um folgendes:

Ich möchte auf x Rechner eine Abfrage vorhandener Tasks machen. Sollte ein Task mit einem bestimmten Namen vorhanden sein, soll ein erfolgreich ausgegeben werden, wenn nicht, eine negative Ausgabe (eine einfache Echo-Ausgabe reicht hier).

Welche Rechner abgefragt werden sollen, werden wieder aus der Config-Datei "hosts.txt" abgefragt. Der Inhalt der Datei sieht (vereinfacht - es gibt dann noch mehr Server) folgendermaßen aus:

:: ***********************************************
:: *    NTBackup-Script               (V4.0)     *
:: *         André F.     - dladfen              *
:: ***********************************************
:: *---------------------------------------------*
:: ***********************************************
:: * Configfile fuer NTBackup-Script             *
:: * Aufbau:                                     *
:: * A#B#C#D#E#F                                 *
:: * A = Hostname                                *
:: * B = lokales Backuplaufwerk (OHNE ":" !!!)   *  
:: * C = zu verwendende bks Datei im bks Ordner  *
:: * D = Sprachversion des Betriebssystems       *
:: * E = Wochentag (MON TUE WED THU FRI SAT SUN) *
:: * F = Uhrzeit                                 *
:: * Genaue Beschreibungen siehe Dokumentation!  *
:: ***********************************************
GMDDDDCMA210#e#CMA210.bks#de#MON#12:00
GMDDDDS00IN1#m#S00IN1.bks#de#SUN#15:00

Der Code der Batch schaut folgendermaßen aus. Es steht normalerweise alles in einer Datei. Allerdings schaffe ich es nicht, in einem Code-Block noch weitere Formatierungen wie zb Fett oder Farbe hereinzubekommen. (Die Zeilenumbrüche stimmen alle im Script, werden nur hier durch die Glossar-Einschiebungen verwurschtelt).

@echo off
cls
@title Schedulescript fuer NTBackup - Andre F. - dladfen
::***********************************************
::* Schedulescript fuer NTBackup-Script (v 4.0) *
::*             Andre F.     - dladfen          *
::***********************************************


:: ***********************************
:: ******          GUI          ******
:: ***********************************
:: *---------------------------------*
:: ***********************************
:: * Erklaerung:                     *
:: * Auflistung der in der Hosts.txt *
:: * eingetragenen Rechner und die   *
:: * Benutzerabfrage                 *
:: ***********************************

@ECHO Auf welche Rechner soll der Task eingestellt werden?
@ECHO.
@ECHO.
@ECHO [ALLE] - Auf alle untenstehende Server
@ECHO.
for /f "tokens=1,2,5,6 delims=# skip=17" %%a in (hosts.txt) do (  
	ECHO [%%a] - Nur auf %%a fuer %%c %%d Uhr
	)
@ECHO.
@ECHO [KEINEN] - bricht den Vorgang ab
@ECHO.

set /p Auswahl=Bitte den "HOSTNAMEN", "ALLE" oder "KEINEN" eingeben (GROSSSCHREIBUNG beachten!):  

@ECHO Vom Benutzer getroffene Auswahl: %auswahl% > Schedule_Log.txt
@ECHO.


:: *****************************************
:: ******           Auswahl           ******
:: *****************************************
:: *---------------------------------------*
:: *****************************************
:: * Erklaerung:                           *
:: * Anhand der Eingabe des Users wird     *
:: * entschieden, welche Abarbeitung folgt *
:: *****************************************

set InstalledSuccessfully=0
set InstalledAllSuccessfully=0
IF %Auswahl% == ALLE (
   GOTO Alle
) ELSE IF %Auswahl% == KEINEN (
   GOTO Keinen
) ELSE (
       for /f "tokens=1 delims=# skip=17" %%a in (hosts.txt) do (  
                    IF %auswahl% == %%a (
                        GOTO Server
                    )       
		)
      	GOTO Fehler
)
      	


:: ******************************************
:: ******      Einzelner Server        ******
:: ******************************************
:: *----------------------------------------*
:: ******************************************
:: * Erklaerung:                            *
:: * Bei der Eingabe eines einzelnen        *
:: * Hostnamen wird dieser Teil ausgefuehrt *
:: ******************************************

:server
for /f "tokens=1,2,5,6 delims=#" %%a in ('findstr %Auswahl% hosts.txt') do (  
	IF EXIST \\%auswahl%\%%b$\backup\backup.cmd (
		(schtasks /create /s %auswahl% /F /tn "NTBackup per Script" /tr %%b:\backup\backup.cmd /sc weekly /d %%c /st %%d /ru Benutzername /rp Benutzerpasswort)  
	) ELSE (
		GOTO EchoStatus
	)
)
goto QueryServer


:: ********************************
:: ******    Alle Server     ******
:: ********************************
:: *------------------------------*
:: ********************************
:: * Erklaerung:                  *
:: * Bei der Eingabe von ALLE     *
:: * wird dieser Teil ausgefuehrt *
:: ********************************

:Alle
for /f "tokens=1,2,5,6 delims=# skip=17" %%a in (hosts.txt) do (  
	IF EXIST \\%%a\%%b$\backup\backup.cmd (
		(schtasks /create /s %%a /F /tn "NTBackup per Script" /tr %%b:\backup\backup.cmd /sc weekly /d %%c /st %%d /ru //Benutzername// /rp //Benutzerpasswort//)  
	) ELSE (
		GOTO EchoStatusAll
	)
)
GOTO QueryAll


:: ***********************************
:: ******    Statusabfragen     ******
:: ***********************************
:: *---------------------------------*
:: ***********************************
:: * Erklaerung:                     *
:: * Hier erfolgt die Abfrage, ob    *
:: * ein Task auf dem Server einge-  *
:: * stellt ist oder nicht.          *
:: ***********************************

:QueryServer
schtasks /query /s %auswahl% /FO List > Schtasks_temp.txt
goto CheckForSuccess

:CheckForSuccess
for /f "tokens=1,2 delims=:" %%a in ('findstr "NTBackup per Script" Schtasks_temp.txt') do (  
	set InstalledSuccessfully=1
)
goto EchoStatus

:EchoStatus
IF %InstalledSuccessfully% == 1 (
	@ECHO Backupscript war auf %auswahl% vorhanden und Zeitplan wurde erfolgreich eingestellt. >> Schedule_Log.txt
	@ECHO Backupscript war auf %auswahl% vorhanden und Zeitplan wurde erfolgreich eingestellt.
	) ELSE (
		@ECHO Backupscript auf %auswahl% nicht vorhanden bzw. Zeitplan konnte nicht eingestellt werden. >> Schedule_Log.txt
		@ECHO Backupscript auf %auswahl% nicht vorhanden bzw. Zeitplan konnte nicht eingestellt werden.
)
goto EndofFile


Dieser Teil funktioniert nicht!!
:QueryAll
for /f "tokens=1 delims=# skip=17" %%a in (hosts.txt) do (  
	schtasks /query /s %%a /FO List >> Schtasks_temp.txt
)
goto CheckForSuccessAll



:CheckForSuccessAll
for /f "tokens=1 delims=# skip=17" %%a in (hosts.txt) do (  
	set IsInFile=%%a
)
for /f "tokens=1,2 delims=:" %%a in ('findstr "%IsInFile%" Schtasks_temp.txt') do (  
	for /f "tokens=1,2 delims=:" %%a in ('findstr "NTBackup per Script" Schtasks_temp.txt') do (  
		set InstalledAllSuccessfully=2
	)
)
goto EchoStatusAll

:EchoStatusAll
for /f "tokens=1 delims=# skip=17" %%a in (hosts.txt) do (  
	IF %InstalledAllSuccessfully% == 2 (
		@ECHO Backupscript war auf %%a vorhanden und Zeitplan wurde erfolgreich eingestellt. >> Schedule_Log.txt
		@ECHO Backupscript war auf %%a vorhanden und Zeitplan wurde erfolgreich eingestellt.
	) ELSE (
		@ECHO Backupscript auf %%a nicht vorhanden bzw. Zeitplan konnte nicht eingestellt werden. >> Schedule_Log.txt
		@ECHO Backupscript auf %%a nicht vorhanden bzw. Zeitplan konnte nicht eingestellt werden.
	)
)
goto EndOfFile



Das hier funktioniert wieder.
:: ********************************
:: ******    Kein Server     ******
:: ********************************
:: *------------------------------*
:: ********************************
:: * Erklaerung:                  *
:: * Bei der Eingabe von KEINEN   *
:: * wird dieser Teil ausgefuehrt *
:: ********************************

:keinen
@ECHO Task wurde auf keinen Rechner eingestellt.
@ECHO Task wurde auf keinen Rechner eingestellt. >> Schedule_Log.txt
GOTO EndOfFile


:: *********************************
:: ******  Falsche Eingabe   *******
:: *********************************
:: *-------------------------------*
:: *********************************
:: * Erklaerung:                   *
:: * Bei der fehlerhaften Eingabe  *
:: * eines Namens wird dieser Teil * 
:: * ausgefuehrt                   *
:: *********************************

:Fehler
@ECHO Eingegebener Name ist kein gueltiger Hostname!
@ECHO Eingegebener Name ist kein gueltiger Hostname! >> Schedule_Log.txt
goto EndOfFile




:EndofFile
del Schtasks_Temp.txt
@title %ComSpec%


Der Inhalt der Schtask_temp.txt sieht folgendermaßen aus, wenn auf beiden Rechnern der Task eingestellt ist:

HostName:      GMDDDDCMA210
TaskName:      NTBackup per Script
Next Run Time: 12:00:00, 26.03.2007
Status:        

HostName:      GMDDDDS00IN1
TaskName:      FreePDF Assistent
Next Run Time: At system start up
Status:        Running

HostName:      GMDDDDS00IN1
TaskName:      NTBackup per Script
Next Run Time: 15:00:00, 25.03.2007
Status:        

Sollte der Task auf einem der beiden Server fehlen (beispielsweise auf GMDDDDCMA210), schaut es folgendermaßen aus:

INFO: There are no scheduled tasks present in the system.

HostName:      GMDDDDS00IN1
TaskName:      FreePDF Assistent
Next Run Time: At system start up
Status:        Running

HostName:      GMDDDDS00IN1
TaskName:      NTBackup per Script
Next Run Time: 15:00:00, 25.03.2007
Status:        

Angedacht war nun folgende Vorgehensweise, die ich leider so noch nicht hinbekommen habe:

1. Er durchsucht die Schedule_temp.txt, ob folgende Textpassage in der Datei vorhanden ist:
HostName:      HOSTNAME
TaskName:      NTBackup per Script

"HOSTNAME" muss dabei natürlich durch einen Wert aus Spalte A aus der Hosts.txt ersetzt werden. Sollte diese Textpassage so vorhanden sein, ist der Task erfolgreich auf dem Rechner eingestellt worden. Wenn nicht vorhanden, halt nicht erfolgreich.

Ich sitz nun seit 2 Tagen an diesem Problem, hab mehrere Möglichkeiten ausprobiert (mit einfachem errorlevel-abfragen angefangen), aber nichts will so richtig klappen.

Wär super, wenn einer von euch ne Idee hätte.

Danke im Voraus, smoo

/edit: Zu den Rückgaben:

1. Ist der Task auf allen Rechnern vorhanden kommt korrekterweise

Backupscript war auf GMDDDDCMA210 vorhanden und Zeitplan wurde erfolgreich eingestellt.
Backupscript war auf GMDDDDS00IN1 vorhanden und Zeitplan wurde erfolgreich eingestellt.

zurück. Fehlt er jetzt aber nur auf einem (der beiden) Server lautet die Ausgabe

Backupscript auf GMDDDDCMA210 nicht vorhanden bzw. Zeitplan konnte nicht eingestellt werden.
Backupscript auf GMDDDDS00IN1 nicht vorhanden bzw. Zeitplan konnte nicht eingestellt werden.

Task ist aber definitiv auf dem GMDDDDS00IN1 vorhanden.

Content-Key: 54785

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

Printed on: April 19, 2024 at 00:04 o'clock

Member: DonSm00chY
DonSm00chY Mar 23, 2007 at 16:20:50 (UTC)
Goto Top
So, hab nun folgende Lösung gefunden:

:QueryAll
for /f "tokens=1 delims=# skip=17" %%a in (hosts.txt) do (  
	schtasks /query /s %%a /FO LIST > %%a.txt
)
goto CheckForSuccessAll


:CheckForSuccessAll
for /f "tokens=1 delims=# skip=17" %%a in (hosts.txt) do (  
	for /f "tokens=2 delims=:" %%b in ('findstr "NTBackup per Script" %%a.txt') do (  
		@ECHO Backupscript war auf %%a vorhanden und Zeitplan wurde erfolgreich eingestellt. >> Schedule_Log.txt
		@ECHO Backupscript war auf %%a vorhanden und Zeitplan wurde erfolgreich eingestellt.
		del %%a.txt
	)	
)
for /f "tokens=1 delims=# skip=17" %%a in (hosts.txt) do (  
	IF EXIST %%a.txt (
		@ECHO Backupscript auf %%a nicht vorhanden bzw. Zeitplan konnte nicht eingestellt werden. >> Schedule_Log.txt
		@ECHO Backupscript auf %%a nicht vorhanden bzw. Zeitplan konnte nicht eingestellt werden.
	del %%a.txt
	)
)
goto EndOfFile

Nächstes mal werd ich ne Woche drüber nachgrübeln, bevor ich was schreibe ;)

Status auf gelöst, viele Grüße an den schließenden Biber, dessen Beiträge mir hier schon oft geholfen haben.

Schönes Wochenende, smoo
Member: Biber
Biber Mar 23, 2007 at 17:04:43 (UTC)
Goto Top
Danke Dir, DonSm00chY,

für die Blumen und im Namen aller für das Veröffentlichen Deines Beitrags.

Nach den vielen Schnarchhähnen der letzten Wochen mit Gestammel wie "eingeschrängte Nutzer", "windoes serve lizens" und "persöhnlichen Ordnern" sind solche Threads eine Wohltat fürs Auge und fürs Forum.

Deshalb schliesse ich den Beitrag nicht, sondern stufe ihn mal um zum Tutorial.

Danke und schönes Wochenende

Biber
Member: Guenni
Guenni Mar 31, 2007 at 12:01:57 (UTC)
Goto Top
@Biber

Hi,

Nach den vielen Schnarchhähnen der letzten Wochen mit Gestammel wie "eingeschrängte Nutzer",
"windoes serve lizens" und "persöhnlichen Ordnern" sind solche Threads eine Wohltat fürs Auge und fürs Forum.

Meinst du so Schnarchhähne, wie diesen hier.....

<Beitrag>
bitte helfen ich hab kein plan !!


also ich möchte ein netzwerk zuhause mit 2 rechern herstellen !! so das wir sachen hin und her schicken können !! und auch austauschne !!

also das heist ich möchte das soo machen wir haben halt einen rechner bei mir stehen mit i-net an schluss und einem im wohnzimmer ohne i-net mein vater will dakeins und ich will beide rechner mit einem kabel so verbinden das wir datein ins netzwerk rein tuhen können und das mein vater sich die dann ankucken, hören oder rüberzieghen können und andersrum auch !! ich hab ein t-dsl modem und einen 8 HUb und ich will das damit irghendwie machen !!geht das überhaupt ???????? wenn ja bitte bitte helft mir ich verzweifel sonst ich hab schon alles versucht !! und wenn ihr mir helkfen könnt könnt ich mir das genau erklären ohne fachgesimpel ich hab da kein plan vonn kann nur zocken daswars ! !! alsp pleas pimp my PC !! bitte bitte !!

Thx imvoraus !!
</Beitrag>

Vielleicht sollte man Scholl dazu anregen, noch eine Rubrik "Hitparade" oder "Zitrone des Monats"
mit Abstimmfunktion anzulegen. Da kann man sich am Wochenende amüsieren und erholen von "Standart",
"Hacken setzen","windoes serve lizens","Kann ich meine Freundin mit einer Batch zum S.. bewegen" etc.

vIeLLeichT FIndeT sihc der nei ode andeRE Standart-Use daRIN wider, und unterläßt es in Zukunft, derartige Beiträge zu schreiben.

Grüße, schönes WE
Günni