6741
Goto Top

Batch zum Abfragen von Clients. Ist der Client da, dann mache etwas.

Moin...
geht irgendwie nicht ...
set n=1

	:start
	ping 192.168.178.%n% -n 1 | findstr "TTL" && goto client_da  
	%n%+1
	goto start

		:client_da	
		start notepad
		%n%+1
		if %n%=255 then goto end
		goto start

:end
gedacht ist, wenn ein Client / IP da ist, dann wird etwas ausgeführt, sprich hier geht zur Kontrolle ein notepad auf. Aber der Loop geht nicht.
Evtl jemand ne Idee???

gruß

Content-Key: 74849

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

Printed on: April 20, 2024 at 03:04 o'clock

Member: TuXHunt3R
TuXHunt3R Nov 29, 2007 at 20:58:03 (UTC)
Goto Top
Versuchs doch mal so (so mache ich die Ping-Abfragen in Batchs immer):

ping <IP oder Computername> -n 1 | find /i "ttl" >nul  
if errorlevel 0 (
start notepad
) else (
echo PC nicht erreichbar.....
)
Member: bastla
bastla Nov 29, 2007 at 21:46:53 (UTC)
Goto Top
Hallo firewalldevil!

Der "ping" sollte eigentlich funktionieren, die Schleife kann nicht gehen, da für das Erhöhen des Zählers ebenfalls ein "set" erforderlich wäre - entweder:
set /a n=%n%+1
oder etwas kürzer:
set /a n+=1

Allerdings würde sich hier auch eine "for"-Schleife anbieten:
@echo off & setlocal
for /l %%n in (1,1,254) do ping 192.168.178.%%n -n 1 | findstr "TTL" >nul && call :client_da %%n  
goto :eof

:client_da
echo Client %1 erreichbar
REM start notepad

Grüße
bastla
Mitglied: 6741
6741 Nov 30, 2007 at 06:23:02 (UTC)
Goto Top
moin bastla,

kannst du mir die Zeile etwas erklären.

Warum setzt du ein setlocal?
Wofür steht die "for /1 %%n in (1,1,254)"?

gruß und schönen start
Member: bastla
bastla Nov 30, 2007 at 07:53:03 (UTC)
Goto Top
Hallo firewalldevil!

Warum setzt du ein setlocal?
Gewohnheitsmäßig; damit wird sichergestellt, dass ev in diesem Batch erzeugte Variablen mit dem Ende des Batches auch wieder verschwinden - da es hier (noch) keine derartigen Variablen gibt, ist das "setlocal" allerdings nicht erforderlich. Da aber beim Ende des Batches ohnehin automatisch ein "endlocal" ausgeführt wird, sollte meines Wissens das "setlocal" keine unerwünschten Nebenwirkungen haben.

Wofür steht die "for /1 %%n in (1,1,254)"?
Ich sollte mir angewöhnen, das "l" groß ("L") zu schreiben ...
... dann könnte es nach einem "for /?" auch richtig zugeordnet werden. face-wink

Mit dem Schalter "/L" wird eine Zählschleife (hier: Zähle von 1 mit der Schrittweite 1 bis 254 mit der Schleifenvariable %%n) erzeugt.

Grüße
bastla
Mitglied: 6741
6741 Nov 30, 2007 at 17:04:28 (UTC)
Goto Top
okay ...

warum setzt du die Variable in %%n?

gruß
Member: bastla
bastla Nov 30, 2007 at 17:18:26 (UTC)
Goto Top
Hallo firewalldevil!

warum setzt du die Variable in %%n?
Du wolltest ja auch "n" verwenden, also bin ich dabei geblieben - und dass Laufvariable in einem Batch mit doppelten Prozentzeichen geschrieben werden, haben wir den Programmierern bei MS zu verdanken. face-wink

Abgesehen davon zeigt Deine Frage, dass Du beim Lesen der Onlinehilfe (hatte ich "for /?" erwähnt) noch nicht wirklich weit gekommen bist ...

Grüße
bastla
Member: Biber
Biber Dec 03, 2007 at 08:11:56 (UTC)
Goto Top
Moin fwd,

Rückfrage: Wie ist denn der gefühlte Beantwortungsgrad Deiner Frage?

Bitte um Feedback.
...oder noch lieber: Bitte um spontanes, ungezwungenes Feedback...

Grüße
Biber
Mitglied: 6741
6741 Dec 03, 2007 at 15:54:57 (UTC)
Goto Top
moin ...

mit "for /?" hast du recht ....

muss ich mir in Ruhe angucken.

In der Anwendung läuft es nicht ganz rund.
Ich möchte damit ranges von IP Bereichen mit dem MBSA abfragen, wenn jetzt ein Client nicht anpingbar ist meldet das Tool das es den Client 192.168.178.. nicht findet. Also müsste sichergestellt sein, das IP die nicht pingbar sind auch mit der anfrage übersprugen werden. Dachte das die for Schleife dies macht, wegen der TTL Abfrage.

gruß
Member: bastla
bastla Dec 03, 2007 at 16:06:44 (UTC)
Goto Top
Hallo firewalldevil!

... IP die nicht pingbar sind auch mit der anfrage übersprugen werden. Dachte das die for Schleife dies macht, wegen der TTL Abfrage.
So sollte es auch sein.
Wir hätten es übrigens leichter, wenn Du den derzeitigen Stand Deines Codes postest ...

Grüße
bastla
Mitglied: 6741
6741 Dec 03, 2007 at 16:53:07 (UTC)
Goto Top
sorry ....

der Code
_______________________________________________
@echo off & setlocal
for /l %%n in (1,1,254) do ping 192.168.178.%%n -n 1 | findstr "TTL" >nul && call :client_da %%n  
goto :eof

exit

:client_da
mbsacli /target 192.168.178.%n% /catalog c:\mbsa\wsusscn2.cab > c:\mbsa\result.txt

_______________________________________________

die Meldung aus der DOS-Box
_______________________________________________
Microsoft Baseline Security Analyzer
Version 2.0.1 (2.0.6706.0)
(C) Copyright 2002-2006 Microsoft Corporation. Alle Rechte vorbehalten.


Überprüfung abgeschlossen.
Der folgende Computername konnte nicht aufgelöst werden: 192.168.178.. Geben Si
 den Computernamen, Domänenname\Computer oder eine IP-Adresse an.
Keine Computer in der Überprüfungsliste.
_______________________________________________


okay ...

evtl sollte ich ne Start IP angeben, da es sich bei den IP´s ab 1 um System handelt wo der MBSA nicht dran kommt. Aber ab IP 100 müsste es gehen. Evtl ne Meldung das die nicht pinbaren nicht da sind und in eine Liste abgelegt werden. Wenn ich jetzt nochmals starte sollte diese überprüft werden und ergänzt.

Wie sieht du das aus der Praxis?

Hintergrund ist, der MBSA kommt bei uns nicht "raus" und ich muss ihn offline laufen lassen mit der aktuellen *.cab Datei.

gruß
Member: Biber
Biber Dec 03, 2007 at 17:08:50 (UTC)
Goto Top
Moin fwd,

mal sehen, ob ich diesmal schneller bin als bastla... face-wink

Wenn Du in der FOR-Anweisung die Zählvariable %%n verwendest, ist diese nur während der Laufzeit der FOR-Anweisung existent und nur innerhalb dieser Codezeile.

Wenn Du aus der FOR-Anweisung jeweils noch einen anderen Code-Block (":client_da") oder einen anderen Batch aufrufst, kennt dieser diese Zählvariable %%n nicht.
Du übergibst dem ":client_da"-Block nur den Wert von %%n (meinetwegen 1 oder 23...), und dieser Wert kommt als Parameter 1 == erster Parameter == %1 in ":Client_da" an.

Also musst Du dort schreiben:
:client_da
mbsacli /target 192.168.178.%1 /catalog c:\mbsa\wsusscn2.cab > c:\mbsa\result.txt

Dann klappt es.

Grüße
Biber
Mitglied: 6741
6741 Dec 03, 2007 at 18:12:04 (UTC)
Goto Top
ich glaube ich versteh es nicht .....

wenn ich in der Zeile "client_da" die Vari %1 angeben, wie bzw wlechen zusammenhang hat diese mit %%n aus der for Schleife?
Member: Biber
Biber Dec 03, 2007 at 18:25:03 (UTC)
Goto Top
Moin fwd,

lass mal kurz die Variable %%n außen vor.

Wenn Du irgendwo in Deinem Batch diesen ":Client_da"-Block CALLst mit...

Call :client_da "eins" "zwei" "waschmaschin"

dann kommen "unten" aus Sicht des geCALLten Blocks ":Client_da" drei Parameter an...
 ::... im Block :Client_da
:Client_da
:: %1 == Parameter1 == "eins"  
:: %2 == Parameter2 == "zwei"  
:: %3 == Parameter3 == "waschmaschin"  

Wenn Du ihn rufst mit "call :client_da Hallo, jemand zu Hause?

 ::... im Block :Client_da
:Client_da
:: %1 == Parameter1 == Hallo
:: %2 == Parameter2 == jemand
:: %3 == Parameter3 == zu
:: ..... usw.

Und wenn Du den Block CALLst mit "call :client_da %%n" und %%n ist ein Schleifenwert von 1 bis 255...

Dann kommt nacheinander die 1, die 2, die 3....die 255 als erster Parameter, also %1 dort an.

Grüße
Biber