lobiwan
Goto Top

Variable innerhalb einer forschleife setzen nicht möglich ?

Ich weiss ja nicht wie blöd ich bin, aber ich verzweifle mittlerweile.
Ich habe hier soviel beispiele gefunden und alle mindestens 2x durchprobiert, nur funktionieren die hier nicht.
Zuletzt habe ich diesen Tipp probiert : Set-Befehl innerhalb einer Schleife funktioniert nicht wie erwartet
Ich brauche das um später mit PSINFO nach einer Software zu scannen ... oder ich darf rennen rennen rennen rennen ....

Folgendes Script will nicht so wie es es möchte :
In der Datei rechner.txt ist pro zeile ein Hostname
Ich brauche die neuen Dateien um sicherzustellen alle mal erfasst zu haben, die die gerade offline sind dann eben beim nächsten mal ...
@ECHO ON
setlocal disabledelayedexpansion 
:: setlocal ensabledelayedexpansion 
For /F "tokens=1" %%i in (rechner.txt) do (  
	SET "PCONLINE=0"  
	ping -n 1 %%i | find "TTL=" && SET "PCONLINE=1"  
	IF "%PCONLINE%"=="1" (   
		ECHO %%i>>online.txt
	) ELSE (
		ECHO %%i>>offline.txt
	)
)

Lobiwan

Content-Key: 112890

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

Printed on: April 16, 2024 at 15:04 o'clock

Member: miniversum
miniversum Mar 31, 2009 at 15:55:03 (UTC)
Goto Top
Die einfachste Möglichkeit wäre so:
@ECHO ON
For /F "tokens=1" %%i in (rechner.txt) do call:teste  
goto:eof

:teste
SET "PCONLINE=0"  
ping -n 1 %1 | find "TTL=" && SET "PCONLINE=1"  
IF "%PCONLINE%"=="1" (   
	ECHO %1>>online.txt
) ELSE (
	ECHO %1>>offline.txt
)
Member: bastla
bastla Mar 31, 2009 at 15:59:10 (UTC)
Goto Top
... oder vielleicht doch nur
for /f "delims=" %i in (rechner.txt) do @ping -n 1 %i|find "TTL=">nul && (echo %i>>online.txt) || (echo %i>>offline.txt)
direkt von der Kommandozeile (bzw eben mit jeweils %%i als Batch) ...

Grüße
bastla
Member: lobiwan
lobiwan Apr 01, 2009 at 07:21:52 (UTC)
Goto Top
miniversum:
So ähnlich hatte ich es auch schon mal, leider wird bei dieser Variante dem Ping kein Rechnernamen übergeben ...
Hier dieAusgabe bei 4 Rechnern in der rechner.txt:
schnipp----
c:\test\>test4.cmd
c:\test\>For /F "tokens=1" %i in (rechner.txt) do call:teste
c:\test\>call:teste
c:\test\>SET "PCONLINE=0"
c:\test\>ping -n 1 | find "TTL=" && SET "PCONLINE=1"
c:\test\>IF "0" == "1" (ECHO 1>>online.txt ) ELSE (ECHO 1>>offline.txt )
c:\test\>call:teste
c:\test\>SET "PCONLINE=0"
c:\test\>ping -n 1 | find "TTL=" && SET "PCONLINE=1"
c:\test\>IF "0" == "1" (ECHO 1>>online.txt ) ELSE (ECHO 1>>offline.txt )
c:\test\>call:teste
c:\test\>SET "PCONLINE=0"
c:\test\>ping -n 1 | find "TTL=" && SET "PCONLINE=1"
c:\test\>IF "0" == "1" (ECHO 1>>online.txt ) ELSE (ECHO 1>>offline.txt )
c:\test\>call:teste
c:\test\>SET "PCONLINE=0"
c:\test\>ping -n 1 | find "TTL=" && SET "PCONLINE=1"
c:\test\>IF "0" == "1" (ECHO 1>>online.txt ) ELSE (ECHO 1>>offline.txt )
c:\test\>
schnipp----

Bastla:
Deine Variante funktioniert gut, nur war dies ja nur ein auszug aus dem ganzen script und ich
wollte später in der schleife noch via PSEXEC nen paar reg-einträge auf die jeweiligen PC's schieben.
Deswegen hatte ich versucht die Variable zu setzen.
Ich "scanne" damit später ca 700 Rechner, bis der damit durch ist könnte der erste schon wieder offline sein.
Für die spätere Verwendung ist die offline.txt am Interessantesten, da ich nach einem durchlauf die
offline.txt in rechner.txt umbennen wollte um wieder von neuem zu beginnen bis eben alle mal gepatched wurden.
Member: lobiwan
lobiwan Apr 01, 2009 at 09:24:44 (UTC)
Goto Top
Ich habe keine Ahnung warum es die ganze Zeit nicht ging, aber warum drüber nachdenken, jetzt geht es und ich werde es mir als Beispiel ablegen.
Falls jemand das gleiche Problem hat, anbei mein Skelett ...
@ECHO OFF
:ANFANG
SET NEUERUNDE=0
IF EXIST offline.txt del offline.txt
IF EXIST online.txt del online.txt
IF NOT EXIST rechner.txt ECHO Fehler ! rechner.txt nicht gefunden ! && Pause && EXIT
FOR /F "tokens=1" %%i IN (rechner.txt) DO CALL:checkPC %%i  
GOTO:NEXTROUND 

:checkPC 
SET "PCONLINE=0"   
ECHO Check PC : %1
ping -n 1 %1 | find "TTL=" >NUL && SET "PCONLINE=1"   
IF "%PCONLINE%"=="1" (    
	ECHO %1>>online.txt 
	ECHO PC %1 ist ON
	CALL:DO_IT %1
) ELSE ( 
	ECHO %1>>offline.txt
	ECHO PC %1 ist OFF
)
GOTO:eof

:DO_IT
ECHO PC %1 wird bearbeitet ...
REM DO Irgendwas ;-)
REM Und noch viel mehr ...
GOTO:eof

:NEXTROUND
IF EXIST offline.txt (
	IF EXIST rechner.txt DEL rechner.txt
	Rename offline.txt rechner.txt
	SET NEUERUNDE=1
)
IF "%NEUERUNDE%"=="1" GOTO ANFANG  
EXIT
In der rechner.txt ist jeweils ein Hostname pro Zeile.

Vielen Dank für die mal wieder super schnelle und kompetente Beantwortung !!!

Lobiwan
Member: miniversum
miniversum Apr 01, 2009 at 11:09:16 (UTC)
Goto Top
Oh da ist ein Fehler in meinem skript.
Änderst du meine Zeile 2 in diese sollte es gehen:
For /F "tokens=1" %%i in (rechner.txt) do call:teste %%i
Member: bastla
bastla Apr 01, 2009 at 12:56:34 (UTC)
Goto Top
Hallo lobiwan!

Nur der Vollständigkeit halber: Wenn Du nur einen Schalter setzen willst, um den Online-Status anzuzeigen, lässt sich das sehr einfach auch innerhalb einer "for"-Schleife realisieren, indem Du auf "DEFINED" abfragst - also (ungetestet) etwa so:
@ECHO OFF & SETLOCAL
:ANFANG
SET NEUERUNDE=0
IF EXIST offline.txt del offline.txt
IF EXIST online.txt del online.txt
IF NOT EXIST rechner.txt (ECHO Fehler ! rechner.txt nicht gefunden ! & Pause & goto :eof)
FOR /F "tokens=1" %%i IN (rechner.txt) DO (  
    SET "PCONLINE="   
    ECHO Check PC : %%i
    ping -n 1 %1 | find "TTL=" >NUL && SET "PCONLINE=1"   
    IF DEFINED PCONLINE (  
        ECHO %%i>>online.txt 
        ECHO PC %%%i ist ON
        CALL:DO_IT %%i
    ) ELSE ( 
        ECHO %%i>>offline.txt
        ECHO PC %%i ist OFF
    )
)

IF EXIST offline.txt (
    move offline.txt rechner.txt
    SET NEUERUNDE=1
)
IF "%NEUERUNDE%"=="1" GOTO ANFANG  
goto :eof

:DO_IT
ECHO PC %1 wird bearbeitet ...
REM DO Irgendwas ;-)
REM Und noch viel mehr ...
GOTO:eof
Je nachem, was unter "noch viel mehr" zu verstehen ist, könnte auch das Unterprogramm ":DO_IT" ebenfalls in die Schleife eingefügt werden (anstelle von "CALL:DO_IT %%i") ...
Meine obige Variante ließe sich übrigens auch so verwenden:
...
for /f "delims=" %%i in (rechner.txt) do @ping -n 1 %%i|find "TTL=">nul && (  
    ECHO %%i>>online.txt 
    ECHO PC %%i ist ON
    CALL:DO_IT %%i
) || (
    ECHO %%i>>offline.txt
    ECHO PC %%i ist OFF
)
...
Grüße
bastla