Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

In Batch-Datei mit schtasks numerierte Tasks löschen, aber nicht alle Tasks

Frage Entwicklung Batch & Shell

Mitglied: mwieapfel

mwieapfel (Level 1) - Jetzt verbinden

16.01.2013 um 10:48 Uhr, 2759 Aufrufe, 13 Kommentare

Hallo allerseits!

Bin noch ein Anfänger, möchte durch kleine Projekte lernen.

Ich möchte auf verschiedenen Netzwerk-Computern überprüfen, welche Tasks geplant sind und bestimmte davon löschen:
Es gibt auf den Rechnern drei Möglichkeiten:
1. es gibt keine geplanten Tasks
2. es gibt Tasks, die sollen bleiben
3. es gibt unterschiedlich viele Tasks, die mit einem konstanten Tasknamen und einer fortlaufenden Nummer bezeichnet werden (Test1, Test2, Test3...)
2. und 3. können auch gemeinsam vorkommen und das ist das eigentliche Problem.

mit query kann ich die Tasks anzeigen und in ein logfile ausgeben, dafür habe ich schon eine Batch-Datei.
wenn ich query durch delete ersetzen würde, müßte ich die entsprechenden Tasknamen angeben.

per Hand (über cmd) kann ich genau benannte Tasks oder alle löschen.

schtasks /Delete /S Computername /TN Test1
oder
schtasks /Delete /S Computername /TN *

Wie kann ich bei /TN eingeben, dass ich z.B. Test1-22 löschen möchte (soweit vorhanden) und dabei andere Tasks (z.B. Backup) bestehen lasse? Test* funktioniert nicht.

Ich habe mir schon soweit geholfen, dass ich für jeden Task eine extra Zeile geschrieben habe, und dabei die entsprechenden Fehlermeldungen, wenn die Tasks nicht da waren, mehr oder weniger ignoriert habe. Dabei habe ich auch jeden PC einzeln angesprochen und jedesmal, wenn die Datei abgearbeitet war, mit "ersetzen" den PC-Namen geändert und die Datei wieder angestoßen.

Das ist aber aufwendig und nicht sehr elegant. Da müßte es doch noch eine hübschere Methode geben, mit einer For-Schleife irgendwie vielleicht, dass ich eine Sprungmarke ansteuere, wenn es keine entsprechenden Tasks mehr gibt und der nächste PC aus der Liste dran ist?


Schon mal vielen Dank,
mwieapfel
Mitglied: colinardo
16.01.2013, aktualisiert um 11:22 Uhr
wie wärs damit ...
01.
@echo off 
02.
setlocal ENABLEDELAYEDEXPANSION 
03.
 
04.
call :DELTASKS PC1 
05.
call :DELTASKS PC2 
06.
call :DELTASKS PC3 
07.
goto END 
08.
 
09.
:DELTASKS 
10.
set computername=%1 
11.
for /L %%i IN (1,1,22) DO ( 
12.
   schtasks /Delete /S !Computername! /TN Test%%i 
13.
   if !ERRORLEVEL! GTR 0 goto endloop 
14.
15.
:endloop 
16.
 
17.
:END 
18.
exit
was du noch machen kannst wäre die PC-Namen in eine Textdatei packen und mit einer FOR-Schleife durchlaufen. Lohnt aber nur wenn es extrem viele sind...
for /F %%i IN (rechner.txt) DO @(call :DELTASKS %%i)
Grüße Uwe
Bitte warten ..
Mitglied: mupan7
16.01.2013 um 13:03 Uhr
Batches sind wunderbar für überschaubare Tasks. Bei derartigen Abfragen wären sie mir zu unsicher.

Die PowerShell bietet einen komplett anderen Ansatz. Hier wird mit Objekten gearbeitet statt mit Strings. Allerdings ist die Lernkurve hoch, und wie es aussieht, brauchst du WMI, was nicht einfach ist: http://powershell.com/cs/media/p/2611.aspx. Bei deiner schon komplexeren Aufgabe sind Batches aber m.E. keine Option.
Bitte warten ..
Mitglied: mwieapfel
17.01.2013 um 08:25 Uhr
Hallo Uwe,

danke für den Vorschlag, sieht schon mal sehr interessant aus. Bin nur am Überlegen, wie und wo ich das in mein schon vorhandenes Ding einbauen kann. Ich habe die Rechnernamen in einer Text-datei, da es tatsächlich viele sind. Wie kann ich meine Vorlage hochladen, dass sie so schön übersichtlich aussieht, wie deine?

An welche Stelle gehört dann die FOR-Schleife für die Textdatei?

Grüße
Renate
Bitte warten ..
Mitglied: mwieapfel
17.01.2013 um 08:36 Uhr
Zitat von mupan7:
Batches sind wunderbar für überschaubare Tasks. Bei derartigen Abfragen wären sie mir zu unsicher.

Die PowerShell bietet einen komplett anderen Ansatz. Hier wird mit Objekten gearbeitet statt mit Strings. Allerdings ist die
Lernkurve hoch, und wie es aussieht, brauchst du WMI, was nicht einfach ist: http://powershell.com/cs/media/p/2611.aspx. Bei
deiner schon komplexeren Aufgabe sind Batches aber m.E. keine Option.

Hallo mupan7,

es mag sein, dass eine andere Vorgehensweise sicherer, effektiver... ist, aber diese Aufgabe ist unter anderem zum Zwecke des learning by doing. Ich hoffe, dass diese Strategie bei mir aufgeht. Ich stelle mir eine Aufgabe und versuche, das dazu nötige Werkzeug zu finden, zu lernen und bei der nächsten Aufgabe mit zu verwenden. Trotzdem danke für Deinen Tipp.

Grüße
Renate
Bitte warten ..
Mitglied: colinardo
17.01.2013, aktualisiert um 09:06 Uhr
Hallo Renate,
also Codezeilen kannst du hier posten indem du sie mit code Tags umschließt. Wenn du einen Beitrag schreibst gibt es darüber einen Tab "Formatierungshilfe" dort kannst du das nachlesen.

Das obige Programm mit eingebauter For-Schleife für die Rechnernamen sieht so aus :
01.
@echo off 
02.
setlocal ENABLEDELAYEDEXPANSION 
03.
for /F %%i IN (rechner.txt) DO @(call :DELTASKS %%i) 
04.
goto END 
05.
 
06.
:DELTASKS 
07.
set computername=%1 
08.
for /L %%i IN (1,1,22) DO ( 
09.
   schtasks /Delete /S !Computername! /TN Test%%i 
10.
   if !ERRORLEVEL! GTR 0 goto endloop 
11.
12.
:endloop 
13.
 
14.
:END 
15.
exit
Bitte warten ..
Mitglied: mwieapfel
17.01.2013, aktualisiert um 11:10 Uhr
Hallo Uwe,

so sieht meine Datei jetzt aus:

01.
REM echo off 
02.
::Variable Datum erstellen 
03.
set datname=%date:~8,2%%date:~3,2%%date:~0,2% 
04.
 
05.
::erstelle Logdatei 
06.
set task_delete_log=D:\BatchDateien\task_delete%datname%.log 
07.
 
08.
::schreibe Startzeit in Logdatei 
09.
echo START TaskDelete.BAT: %date% %time:~0,5% 1>>%task_delete_log% 2>&1 
10.
 
11.
::schreibe Leerzeile in Logdatei 
12.
echo. 1>>%task_delete_log% 2>&1 
13.
 
14.
setlocal ENABLEDELAYEDEXPANSION 
15.
 
16.
for /F %%i IN (rechner.txt) do @(call :DELTASKS %%i) 
17.
goto END 
18.
 
19.
:DELTASKS 
20.
set computername=%1 
21.
for /L %%i IN (1,1,22) DO ( 
22.
schtasks /Delete /F /S !Computername! /TN test%%i 
23.
if !ERRORLEVEL! GTR 0 goto endloop 
24.
25.
:endloop 
26.
 
27.
:END 
28.
REM exit 
29.
pause
Meine Kommentare habe ich mal mit aufgeschrieben. Ich möchte das Ergebnis in einer log-Datei ausgeben. Der Anfang funktioniert gut, die Datei wird erzeugt und Start-Datum wird reingeschrieben. Die Tasks werden auch richtig entfernt. Wenn ich aber einen echo-Befehl voranstelle und mit dem do call verknüpfen will (mit &&do call...) erhalte ich die Fehlermeldung, do kann nicht gefunden werden. Welchen Denkfehler habe ich da drin? oder müßte ich eher den echo mit && hinten anfügen? oder ohne &&?
Bitte warten ..
Mitglied: colinardo
17.01.2013 um 12:08 Uhr
Das Problem bei obigen Code ist noch das wenn ein Task z.B. zwischen task1-22 fehlt bricht er die ganze Schleife ab; d.h. wenn ein Task fehlt aber dahinter noch weitere existieren werden diese nicht gelöscht. Deswegen musst du alle 22 Schritte durchlaufen um wirklich alle existierenden Tasks zu erfassen.
Mach den folgenden Abschnitt so:

01.
:DELTASKS 
02.
set computername=%1 
03.
for /L %%i IN (1,1,22) DO @( 
04.
schtasks /Delete /F /S !Computername! /TN test%%i >>nul 2>&1 
05.
if !ERRORLEVEL! == 0 ( 
06.
	echo Task 'test%%i' wurde auf !computername! entfernt >>!task_delete_log! 
07.
) else ( 
08.
        echo Task 'test%%i' existiert auf !computername! nicht >>!task_delete_log! 
09.
10.
11.
goto :eof
Bitte warten ..
Mitglied: andimue
17.01.2013 um 12:55 Uhr
Hallo,

hier noch 2 Denkanstösse zum Thema "Wildcard-Löschen":

01.
for /f %%x in ('schtasks /query ^| findstr Test') do schtasks /Delete /TN %%x /F
und noch was, sagen wir mal non-konformes:

01.
del %SystemDrive%\Windows\Tasks\Test*
Gruß
Andi
Bitte warten ..
Mitglied: mwieapfel
17.01.2013 um 15:00 Uhr
Besten Dank, Uwe!

ich habs noch ein bißchen verändert bzw verhübscht, sieht dann komplett so aus:

01.
@echo off 
02.
::Variable Datum erstellen 
03.
set datname=%date:~8,2%%date:~3,2%%date:~0,2% 
04.
 
05.
::erstelle Logdatei 
06.
set task_delete_log=D:\BatchDateien\task_delete%datname%.log 
07.
 
08.
::schreibe Startzeit in Logdatei 
09.
echo START TaskDelete.BAT: %date% %time:~0,5% 1>>%task_delete_log% 2>&1 
10.
 
11.
::schreibe Leerzeile in Logdatei 
12.
echo. 1>>%task_delete_log% 2>&1 
13.
 
14.
setlocal ENABLEDELAYEDEXPANSION 
15.
 
16.
for /F %%i IN (rechner.txt) do @(call :DELTASKS %%i) 
17.
goto end 
18.
 
19.
:DELTASKS 
20.
set computername=%1 
21.
for /L %%i IN (1,1,22) DO @( 
22.
schtasks /Delete /F /S !Computername! /TN test%%i >>nul 2>&1 
23.
if !ERRORLEVEL! == 0 ( 
24.
	echo !computername! Task 'test%%i' wurde entfernt >>!task_delete_log! 
25.
) else ( 
26.
	echo !computername! keine weiteren Test-Tasks >>!task_delete_log! 
27.
28.
29.
::schreibe Leerzeile in Logdatei 
30.
echo. 1>>%task_delete_log% 2>&1 
31.
goto end 
32.
 
33.
:end 
34.
echo ENDE TaskDelete.BAT: %date% %time:~0,5% 1>>%task_delete_log% 2>&1
die Tasks sind durchlaufend numeriert, wenn einer fehlt, kommt auch keiner mehr danach, also dürfte bzw sollte die Schleife ruhig abbrechen und zum nächsten PC gehen, sonst wird das logfile zu unübersichtlich.
Wie geht das?


das :endloop hab ich dann weggelassen, ist das ok?

ist das mit dem :end richtig? scheint zumindest zu funktionieren, allerdings kommt die Endzeit nach jedem PC und am Ende doppelt. Fehlt da noch was?

Vielen Dank für deine Mühe, hab schon viel gelernt dabei.
Bitte warten ..
Mitglied: colinardo
17.01.2013, aktualisiert um 15:17 Uhr
Du hast das goto :eof nach der DELTASKS-FOR-Schleife nicht mit eingefügt. Du musst dir die Markierung :DELTASKS wie eine Subroutine vorstellen die dann bei goto :eof wieder an die Stelle zurückspringt wo diese Subroutine aufgerufen wurde (hier war das die Stelle in der ersten Schleife: call :DELTASKS %%i). Diese Subroutine haben wir zusätzlich mit einem Parameter aufgerufen %%i, auf den du dann in der Subroutine mit %1 zugreifst.

Hoffe das war verständlich ; wenn nicht hier ein Link dazu.

Hier der komplette Code

01.
@echo off 
02.
::Variable Datum erstellen 
03.
set datname=%date:~8,2%%date:~3,2%%date:~0,2% 
04.
 
05.
::erstelle Logdatei 
06.
set task_delete_log=D:\BatchDateien\task_delete%datname%.log 
07.
 
08.
::schreibe Startzeit in Logdatei 
09.
echo START TaskDelete.BAT: %date% %time:~0,5% 1>>%task_delete_log% 2>&1 
10.
 
11.
::schreibe Leerzeile in Logdatei 
12.
echo. 1>>%task_delete_log% 2>&1 
13.
 
14.
setlocal ENABLEDELAYEDEXPANSION 
15.
 
16.
for /F %%i IN (rechner.txt) do @(call :DELTASKS %%i) 
17.
goto end 
18.
 
19.
:DELTASKS 
20.
set computername=%1 
21.
for /L %%i IN (1,1,22) DO @( 
22.
schtasks /Delete /F /S !Computername! /TN test%%i >>nul 2>&1 
23.
if !ERRORLEVEL! == 0 ( 
24.
	echo !computername! Task 'test%%i' wurde entfernt >>!task_delete_log! 
25.
) else ( 
26.
	echo !computername! keine weiteren Test-Tasks >>!task_delete_log! 
27.
        goto :endloop 
28.
29.
30.
:endloop 
31.
goto :eof 
32.
 
33.
::schreibe Leerzeile in Logdatei 
34.
echo. 1>>%task_delete_log% 2>&1 
35.
goto end 
36.
 
37.
:end 
38.
echo ENDE TaskDelete.BAT: %date% %time:~0,5% 1>>%task_delete_log% 2>&1
Jetzt viel Spaß

Grüße Uwe
Bitte warten ..
Mitglied: mwieapfel
17.01.2013 um 15:52 Uhr
Vielen Dank! Funktioniert prima, Deine Erklärung ist toll, hab ich soweit verstanden und hoffe, das beim nächsten Projekt umsetzen zu können.

Selbst auf die Gefahr, dass ich lästig werde, eine letzte Frage:

bei if !ERRORLEVEL! ==0 könnte man da auch statt else auch 2 verschiedene Möglichkeiten definieren? Task gefunden ist klar, Task nicht gefunden ist auch klar, 3. Möglichkeit: PC nicht erreicht (ist gerade ausgeschaltet) da kommt zur Zeit auch die Meldung: kein Task da. ist das schwierig zu differenzieren? Wenns zu kompliziert ist, kann ich auch mit dieser doch recht hübschen Variante leben und beim nächsten Projekt weitermachen.

Auf jeden Fall Danke für Deine Mühe.

Viele Grüße
Renate
Bitte warten ..
Mitglied: colinardo
17.01.2013 um 17:31 Uhr
Für einen Test ob der jeweilige PC online ist sollte dieser Pings akzeptieren.
Dann baust du noch folgendes in dein Script zwischen Zeile 20 und 21 ein:

01.
ping -n 1 -w 500 %computername% | find /c "TTL=" >nul 
02.
if %ERRORLEVEL% == 1 ( 
03.
	echo PC '%computername%' ist offline ! >>%task_delete_log 
04.
	goto :endloop 
05.
)
Gehe jetzt davon aus das die Rechner alle in einem lokalen Netz stehen, wenn nicht musst du eventuell die Wartezeit der Pings erhöhen (-w 500).
Bitte warten ..
Mitglied: mwieapfel
18.01.2013 um 14:21 Uhr
Ganz herzlichen Dank, ist ne gute Idee mit dem anpingen. Dann werde ich mal weiterbasteln und ausprobieren, was ich da noch so alles anstellen kann.

Schönes Wochenende!

Renate
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch datei zum duplikate löschen
gelöst Frage von M4xx-oneBatch & Shell5 Kommentare

Hallo Gemeinde ich hab ein problem ich möchte mittels batchdatei eine TXT datei aufräumen die datei hat folgende eintäge ...

Batch & Shell
Batch Datei zum löschen des Papierkorbes
Frage von Munin92Batch & Shell3 Kommentare

Guten Abend liebe Community, ich hoffe das ich in diesem Forum für diese Frage richtig bin. Und zwar habe ...

Batch & Shell
Batch Datei um Windows Update zu löschen
Frage von lordofremixesBatch & Shell1 Kommentar

Hallo zusammen, wegen diesem Office Update welches ich per GPO deinstallieren lassen soll, werd ich noch verrückt. Ich hab ...

Batch & Shell
älteste dateien via batch löschen
gelöst Frage von cali169Batch & Shell6 Kommentare

hallo zusammen, ich habe nichts zu meinem problem gefunden, falls ich es überlesen habe bitte ich um milde :) ...

Neue Wissensbeiträge
MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 7 StundenMikroTik RouterOS4 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 7 StundenSicherheit

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Administrator.de Feedback

Entwicklertagebuch: Die Startseite wurde überarbeitet

Information von admtech vor 10 StundenAdministrator.de Feedback9 Kommentare

Hallo Administrator User, mit dem Release 5.7 haben wir unsere Startseite überarbeitet und die Beiträge und Fragen voneinander getrennt. ...

Vmware

VMware Desktopprodukte sind verwundbar

Information von Penny.Cilin vor 15 StundenVmware

Die VMware-Anwendungen zum Umgang mit virtuellen Maschinen Fusion, Horizon Client und Workstation sowie die Plattform NSX sind verwundbar. Davon ...

Heiß diskutierte Inhalte
Visual Studio
Vb.net-Tool zum Erzeugen einer Outlook-E-Mail
Frage von ahstaxVisual Studio24 Kommentare

Hallo, ich möchte gerne ein vb.net-Tool schreiben, das am Ende eine Outlook-E-Mail erzeugt. Grundsätzlich ist mir klar, wie das ...

Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server16 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows Netzwerk
Netzwerk Neustrukturierung
Frage von IT-DreamerWindows Netzwerk16 Kommentare

Hallo verehrte Community und Admins, bei uns im Haus steht eine Neustrukturierung an. Dafür benötige ich von euch ein ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...