Womit kann ich in einer Batch viertelstündlich eine andere Batch aufrufen?
Hallo allerseits!
Seit drei Stunden versuche ich selbst einen geeigneten Befehl zu finden, bzw. hier im Forum eine Antwort zu finden. Ich möchte nicht mit "schtasks" vorgehen, weil ich nicht in Windows eingreifen möchte (und wegen mangelnder Rechte vermutlich auch nicht kann).
Problem: Unsere Netzwerkdrucker verstellen sich immer wieder, es soll sich nach Auskunft unserer IT-Experten um einen Windows-Bug handeln. Nun haben unsere IT-Mitarbeiter ein Script geschrieben, das die Druckerzuweisungen jeweils wiederherstellen kann. Ich habe es in meinen Autostart-Ordner kopiert, also werden meine Drucker gleich bei der Anmeldung korrekt zugewiesen. Anscheinend verstellt sich das während der Arbeit aber wieder -- also überlege ich, das Script per Batch einfach jede Viertelstunde laufen zu lassen, um so selten wie möglich über fehlende Drucker zu stolpern.
Gibt es einen Parameter in "start" oder "call", den ich meine kleine Batch schreiben könnte, um viertelständlich das besagte Script auszuführen? Oder einen anderen Befehl, der eine Art Delay erlaubt, ohne allzuviele Ressourcen zu benötigen?
Vielen Dank für jeden Ratschlag oder jede Idee!
Gruß,
redeye
Seit drei Stunden versuche ich selbst einen geeigneten Befehl zu finden, bzw. hier im Forum eine Antwort zu finden. Ich möchte nicht mit "schtasks" vorgehen, weil ich nicht in Windows eingreifen möchte (und wegen mangelnder Rechte vermutlich auch nicht kann).
Problem: Unsere Netzwerkdrucker verstellen sich immer wieder, es soll sich nach Auskunft unserer IT-Experten um einen Windows-Bug handeln. Nun haben unsere IT-Mitarbeiter ein Script geschrieben, das die Druckerzuweisungen jeweils wiederherstellen kann. Ich habe es in meinen Autostart-Ordner kopiert, also werden meine Drucker gleich bei der Anmeldung korrekt zugewiesen. Anscheinend verstellt sich das während der Arbeit aber wieder -- also überlege ich, das Script per Batch einfach jede Viertelstunde laufen zu lassen, um so selten wie möglich über fehlende Drucker zu stolpern.
Gibt es einen Parameter in "start" oder "call", den ich meine kleine Batch schreiben könnte, um viertelständlich das besagte Script auszuführen? Oder einen anderen Befehl, der eine Art Delay erlaubt, ohne allzuviele Ressourcen zu benötigen?
Vielen Dank für jeden Ratschlag oder jede Idee!
Gruß,
redeye
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 277156
Url: https://administrator.de/contentid/277156
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
16 Kommentare
Neuester Kommentar
Hallo red-eye,
g r e x i t
Zitat von @red-eye:
Ich möchte nicht mit "schtasks" vorgehen, weil ich nicht in Windows eingreifen möchte (und wegen mangelnder Rechte
vermutlich auch nicht kann).
sorry, das ist die blödeste Ausrede die ich je gehört habe , mit eurem Script greifst du doch auch in Windows ein ...Ich möchte nicht mit "schtasks" vorgehen, weil ich nicht in Windows eingreifen möchte (und wegen mangelnder Rechte
vermutlich auch nicht kann).
Oder einen anderen Befehl, der eine Art Delay erlaubt
timeout /t 900
g r e x i t
Du kannst in der Batch eine Schleife/Timer einbauen der alle x Sekunden deine Batch der IT ausführt.
evtl kannst du es auch im Taskplaner einsetzten oder halt die IT Fragen ob die es im taskplaner einbauen können.
Aber die Frage ist halt ob du auch Rechte hast Drucker zu ändern oder ob dies nur mit Adminrechte geht.
Da die meisten Druckereinstellungen nur von Admin gemacht werden kann damit kein User was verstelllt...
evtl kannst du es auch im Taskplaner einsetzten oder halt die IT Fragen ob die es im taskplaner einbauen können.
Aber die Frage ist halt ob du auch Rechte hast Drucker zu ändern oder ob dies nur mit Adminrechte geht.
Da die meisten Druckereinstellungen nur von Admin gemacht werden kann damit kein User was verstelllt...
Moin,
Was steht in der Ereignisanzeige?
Wir haben hier 60.000 Anwender weltweit. Und diese nutzen mehrere 1000 Netzwerkdrucker. Hier werden keine Verbindungen verloren, höchstens, wenn der zuständige Printserver neu gestartet wird und der Anwender noch angemeldet ist.
Um welches Betriebssystem (Server/Client) handelt es sich?
Gruss Penny.
Problem: Unsere Netzwerkdrucker verstellen sich immer wieder, es soll sich nach Auskunft unserer IT-Experten um einen Windows-Bug
handeln. Nun haben unsere IT-Mitarbeiter ein Script geschrieben, ...
Hm, das finde ich jetzt seltsam. Mir dieser Bug nicht bekannt. Inwiefern verstellen sich die Netzwerkdrucker?handeln. Nun haben unsere IT-Mitarbeiter ein Script geschrieben, ...
Was steht in der Ereignisanzeige?
Wir haben hier 60.000 Anwender weltweit. Und diese nutzen mehrere 1000 Netzwerkdrucker. Hier werden keine Verbindungen verloren, höchstens, wenn der zuständige Printserver neu gestartet wird und der Anwender noch angemeldet ist.
Um welches Betriebssystem (Server/Client) handelt es sich?
Gruss Penny.
Hallo red-eye.
Ich will jetzt gar nicht ins gleiche Horn blasen, dass eure Admins da Hand anlegen müssen. Davon hast du nichts und das bringt dich kurzfristig nicht weiter.
Es ist aber unsinnig dein VBScript mit einem Batch neu zu starten. Die Geschichte würde ich dann in einer Schleife direkt in der "druckerverbinden.vbs" unterbringen. Damit erledigt sich auch automatisch das nervige Konsolefenster. Wenn es also nicht allzu geheim ist, poste doch einfach mal den Inhalt des Scripts. Dann bastle ich die Schleife rein und gut. Vielleicht lässt sich sogar noch ein Event abfangen, wenn die Netzwerkdrucker (warum auch immer) getrennt werden...
Grüße
rubberman
Ich will jetzt gar nicht ins gleiche Horn blasen, dass eure Admins da Hand anlegen müssen. Davon hast du nichts und das bringt dich kurzfristig nicht weiter.
Es ist aber unsinnig dein VBScript mit einem Batch neu zu starten. Die Geschichte würde ich dann in einer Schleife direkt in der "druckerverbinden.vbs" unterbringen. Damit erledigt sich auch automatisch das nervige Konsolefenster. Wenn es also nicht allzu geheim ist, poste doch einfach mal den Inhalt des Scripts. Dann bastle ich die Schleife rein und gut. Vielleicht lässt sich sogar noch ein Event abfangen, wenn die Netzwerkdrucker (warum auch immer) getrennt werden...
Grüße
rubberman
Hallo redeye.
der Schalter /b besagt nur, dass ein aufgerufenes Konsole(!)-Tool oder -Script im gleichen Fenster läuft, wie dein Batch. Verstecken/minimieren tust du damit Garnichts.
Ich geb dir mal was zum Testen mit. VBScript (also Dateiendung .vbs):
Wenn ein Drucker verschwindet, sollte sich ein Popup öffnen. Schreib mal die Namen mit, die du angezeigt bekommst. Vermutlich bekomme ich daraus den Rest zusammengebastelt.
BTW: Das Script nur einmal ausführen. Es öffnet sich kein Fenster, läuft aber trotzdem (findest du im Taskmanager als Prozess "wscript.exe").
Grüße
rubberman
der Schalter /b besagt nur, dass ein aufgerufenes Konsole(!)-Tool oder -Script im gleichen Fenster läuft, wie dein Batch. Verstecken/minimieren tust du damit Garnichts.
die Adresse des Scripts (sie beginnt mit zwei Backslashes) kopiere und in der Explorer einsetze
Nur den Pfad, ohne den Dateiname. Sonst klappt es natürlich nicht.Ich geb dir mal was zum Testen mit. VBScript (also Dateiendung .vbs):
Option Explicit
Dim objWMIService, objEventSource, objEvent
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set objEventSource = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceDeletionEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Printer'")
Do
Set objEvent = objEventSource.NextEvent
MsgBox objEvent.TargetInstance.Name, _
vbInformation Or vbSystemModal, _
"Drucker entfernt:"
Loop
BTW: Das Script nur einmal ausführen. Es öffnet sich kein Fenster, läuft aber trotzdem (findest du im Taskmanager als Prozess "wscript.exe").
Grüße
rubberman
Hallo redeye,
Murphy's Law schlägt immer dann zu, wenn man es nicht braucht
OK, gehen wir mal einen Schritt weiter, auch wenn nicht ganz klar ist, ob es funktionieren könnte. Was soll schon passieren, außer dass eben nichts passiert ...
Wichtig ist, dass du das Array aPrinters (Zeile 8 ff) entsprechend mit deinen Druckern anpasst. Die Namen sind kommagetrennt (der Unterstrich verkettet die Codezeile über die Zeilenumbrüche hinweg). Der erste Druckername soll der Standarddrucker sein.
Grüße
rubberman
Murphy's Law schlägt immer dann zu, wenn man es nicht braucht
OK, gehen wir mal einen Schritt weiter, auch wenn nicht ganz klar ist, ob es funktionieren könnte. Was soll schon passieren, außer dass eben nichts passiert ...
Option Explicit
Dim objWMIService, objEventSource, objEvent, objNetwork, _
aPrinters, strPrinter
' Array der Drucker, die verbunden/überwacht werden sollen im Format "\\Printserver\Druckerfreigabename"
' Der erste Drucker im Array wird als Standarddrucker angenommen
aPrinters = Array( _
"\\Server1\Drucker1", _
"\\Server1\Drucker2", _
"\\Server1\Drucker3", _
"\\Server1\Drucker4" _
)
' Objekte instanziieren
Set objNetwork = CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
' Vesuchen beim Scriptstart zunächst alle Drucker zu verbinden
For Each strPrinter In aPrinters
addPrinter objNetwork, strPrinter, aPrinters(0)
Next
' Überwachung für getrennte Drucker initialisieren
Set objEventSource = objWMIService.ExecNotificationQuery _
("SELECT * FROM __InstanceDeletionEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Printer'")
' Auf ein Event warten, prüfen ob der getrennte Drucker zu den im Array angegebenen gehört und versuchen neu zu verbinden
Do
Set objEvent = objEventSource.NextEvent
For Each strPrinter In Filter(aPrinters, objEvent.TargetInstance.Name, True, vbTextCompare)
addPrinter objNetwork, strPrinter, aPrinters(0)
Next
Loop
' Subroutine zum Verbinden eines Netzwerkdruckers
Sub addPrinter(ByRef oNetwork, ByRef sPrinter, ByRef sDefaultPrinter)
On Error Resume Next
oNetwork.AddWindowsPrinterConnection sPrinter
If StrComp(sPrinter, sDefaultPrinter, vbTextCompare) = 0 Then
oNetwork.SetDefaultPrinter sPrinter
End If
On Error Goto 0
End Sub
Grüße
rubberman