red-eye
Goto Top

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

Content-ID: 277156

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

122990
122990 12.07.2015 aktualisiert um 22:09:37 Uhr
Goto Top
Hallo red-eye,
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 face-big-smile, mit eurem Script greifst du doch auch in Windows ein ...

Oder einen anderen Befehl, der eine Art Delay erlaubt
timeout /t 900

g r e x i t
red-eye
red-eye 12.07.2015 aktualisiert um 22:38:42 Uhr
Goto Top
Hallo grexit!

(Hätte nicht gedacht, dass ich den Grexit mal begrüßen würde. face-wink)

Du lachst, aber ich leide! Das Script haben unsere IT-Mitarbeiter erstellt. Ich meinerseits habe eingeschränkte Nutzer-Rechte, darf aber Batches verwenden. Die IT-Abteilung sagt: Windows-Bug, können wir nichts machen, erledigt. Sie schreiben es sogar noch viel schöner: "Ticket geschlossen".

Mit Deinem Tipp kann ich möglicherweise etwas zusammenbasteln, vielen Dank!

Gruß,
redeye
kaiand1
kaiand1 13.07.2015 um 04:36:00 Uhr
Goto Top
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...
joehuaba
joehuaba 13.07.2015 um 08:00:14 Uhr
Goto Top
Hallo, ganz einfach face-smile

@echo off
:Schleife
"deinebatchdatei.bat"  
timeout 900
GOTO Schleife
Exit

Achtung! Nicht getestet, sollte aber klappen face-smile
Penny.Cilin
Penny.Cilin 13.07.2015 um 08:43:46 Uhr
Goto Top
Zitat von @red-eye:

Hallo allerseits!
Moin,

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?
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.
red-eye
red-eye 13.07.2015 aktualisiert um 22:20:56 Uhr
Goto Top
Hallo zusammen,

herzlichen Dank für Eure Antworten! face-smile

Zitat von @Penny.Cilin:
Hm, das finde ich jetzt seltsam. Mir dieser Bug nicht bekannt. Inwiefern verstellen sich die Netzwerkdrucker?

Ich kann das eigentlich auch nicht so ganz glauben, aber so wird es bei uns begründet. Ich bin nicht sicher, ob ich unter den Augen aller Admins hier im Forum etwas über unsere IT-Abteilung äußern soll, vielleicht soviel: es gibt viele Baustellen in unserer Software.

Ich werde morgen mal Deinen Fragen nachgehen. Ich weiß nicht, ob ich alles beantworten kann, weil ich über Netzwerkdrucken nicht viel weiß, aber ich versuch's.

Meine Test-Batches sehen so aus, also fast identisch zu der von joehuaba:

drucker1.bat:
@ echo off
start /b drucker2.bat

drucker2.bat:
@ echo off
set x=1
:again
start /b druckerverbinden.vbs
timeout /t 900 >nul
set /a x=x+1
if not %x%==36 goto again
exit

Leider klappt das mit dem unsichtbaren Starten (Schalter /b) nicht.

Viele Grüße,
redeye, der sich jetzt doch mal schlafen legt
red-eye
red-eye 14.07.2015 um 23:03:06 Uhr
Goto Top
Wir arbeiten an Terminalservern, die vermutlich auf Windows Server 2008 R2, SP1 basieren. In "Geräte und Drucker" sind angegeben ein PDF-Builder und unsere drei Drucker. Manchmal fehlen die Drucker (außer PDF) darin - ich kann leider nicht erkennen, warum. Ich konnte leider auch das Drucker-Wiederherstellungsscript nicht entdecken, es liegt wahrscheinlich auf einem Laufwerk, auf das ich keinen Zugriff habe.

Ich murkse einfach mit meinen kleinen Batches, das klappt tatsächlich ganz gut. Allerdings kann ich das DOS-Fenster, oder die cmd-Instanz, oder was auch immer da aufgerufen habe, nicht unsichtbar laufen lassen. Das DOS-Fenster, mit dem das Sript startet, druckerverbinden.bat, schließt nie.
rubberman
rubberman 14.07.2015 um 23:38:34 Uhr
Goto Top
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
red-eye
red-eye 15.07.2015 um 21:54:19 Uhr
Goto Top
Hallo rubberman,

vielen Dank, dass Du Dich hier einschaltest! face-smile

Zitat von @rubberman:
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. ... Dann bastle ich die Schleife rein und gut.

Vielen Dank für Dein Hilfsangebot! Ich murkse natürlich ganz furchtbar, weil ich auf dem Terminalserver nur s e h r eingeschränkte Nutzerrechte habe.

Murks 1: Ich weiß nicht, was in dem Script steht, weil ich es nicht finden kann. Wenn ich aus den Eigenschaften der Verknüpfung, die im Startmenue unter Programmen agelegt wurde, die Adresse des Scripts (sie beginnt mit zwei Backslashes) kopiere und in der Explorer einsetze, erhalte ich leider nur Fehlermeldungen. Ich gehe davon aus, dass ich keine Rechte für das vermutlich versteckte Verzeichnis habe. Ich werde nochmals gezielt probieren, ob ich auch versteckte Ordner anzeigen lassen kann, aber bisher konnte ich das Script selbst nicht finden. Also rufe ich es mit einer Batch auf, das geht komischerweise.

Murks 2: Um die aufrufende Batch minimiert oder versteckt zu starten, rufe ich sie wiederum mit einer Batch auf. Klappt aber sowieso anscheinend mit dem Schalter /b nicht, also kann ich mir die erste Batch auch sparen. Was wenigstens klappt: Ich kann Meine Batch in den Autostartordner kopieren, und siehe da, ich bin seit ein paar Tagen der einzige in meiner Abteilung, der regelmäßig ohne Ärger drucken kann. face-smile

Zitat von @rubberman:
Damit erledigt sich auch automatisch das nervige Konsolenfenster.

Lustig ist daran, dass das kleine Kommando, das deren Script aufruft, offenbar selbst eine kleine Batch ist, allerdings haben sie die Endung .cmd verwendet. Es erscheint in einem kleinen Konsolenfenster und beendet sich dann.

Zitat von @rubberman:
Vielleicht lässt sich sogar noch ein Event abfangen, wenn die Netzwerkdrucker (warum auch immer) getrennt werden...

Ich suche nochmal intensiver - das wäre natürlich eine großartige Sache, wenn das gelänge!

Beste Grüße,
redeye
rubberman
rubberman 15.07.2015 aktualisiert um 22:32:37 Uhr
Goto Top
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.

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
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
red-eye
red-eye 15.07.2015 um 22:44:25 Uhr
Goto Top
Ich werde es morgen mal an Ort und Stelle probieren!
Vielen Dank! face-smile
red-eye
red-eye 16.07.2015 um 22:44:48 Uhr
Goto Top
Sorry, habe es nicht mehr geschafft, Dein Script zu testen. face-sad
Habe aber deren vbe-Datei doch noch lokalisiert und in vbs decodiert.
rubberman, kann ich Dir das Script einmal zukommen lassen, ohne es hier zu veröffentlichen?
So, und morgen nächster Anlauf, Dein diagnostisches Script laufen zu lassen.
rubberman
rubberman 16.07.2015 um 22:50:14 Uhr
Goto Top
ohne es hier zu veröffentlichen
Gibt doch auch private Nachrichten hier face-wink
red-eye
red-eye 18.07.2015 um 00:29:40 Uhr
Goto Top
Ich habe Dir den Kode per PN übermittelt.

Heute habe ich Dein Test-Script fast den ganzen Tag mitlaufen lassen. Während vor wenigen Tagen fast bei jedem Druckversuch Probleme auftraten, ist heute "leider" die Druckerzuordnung stabil gewesen. Ich werde weiter beobachten und Dir ggf. gefundene Störungen übermitteln.

Vielen Dank für Deine Unterstützung bis hierher! face-smile
rubberman
rubberman 18.07.2015 um 01:00:19 Uhr
Goto Top
Hallo redeye,

Murphy's Law schlägt immer dann zu, wenn man es nicht braucht face-wink

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 ... face-smile
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
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
red-eye
red-eye 18.07.2015 um 20:14:34 Uhr
Goto Top
Vielen Dank! face-smile Ich werde Montag vor Ort weitermachen!