Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Variable innerhalb einer forschleife setzen nicht möglich ?

Frage Entwicklung Batch & Shell

Mitglied: lobiwan

lobiwan (Level 1) - Jetzt verbinden

31.03.2009, aktualisiert 17:49 Uhr, 3686 Aufrufe, 6 Kommentare

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 ...
01.
@ECHO ON 
02.
setlocal disabledelayedexpansion  
03.
:: setlocal ensabledelayedexpansion  
04.
For /F "tokens=1" %%i in (rechner.txt) do ( 
05.
	SET "PCONLINE=0" 
06.
	ping -n 1 %%i | find "TTL=" && SET "PCONLINE=1" 
07.
	IF "%PCONLINE%"=="1" (  
08.
		ECHO %%i>>online.txt 
09.
	) ELSE ( 
10.
		ECHO %%i>>offline.txt 
11.
12.
13.
 
Lobiwan
Mitglied: miniversum
31.03.2009 um 17:55 Uhr
Die einfachste Möglichkeit wäre so:
01.
@ECHO ON 
02.
For /F "tokens=1" %%i in (rechner.txt) do call:teste 
03.
goto:eof 
04.
 
05.
:teste 
06.
SET "PCONLINE=0" 
07.
ping -n 1 %1 | find "TTL=" && SET "PCONLINE=1" 
08.
IF "%PCONLINE%"=="1" (  
09.
	ECHO %1>>online.txt 
10.
) ELSE ( 
11.
	ECHO %1>>offline.txt 
12.
)
Bitte warten ..
Mitglied: bastla
31.03.2009 um 17:59 Uhr
... 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
Bitte warten ..
Mitglied: lobiwan
01.04.2009 um 09:21 Uhr
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.
Bitte warten ..
Mitglied: lobiwan
01.04.2009 um 11:24 Uhr
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 ...
01.
@ECHO OFF 
02.
:ANFANG 
03.
SET NEUERUNDE=0 
04.
IF EXIST offline.txt del offline.txt 
05.
IF EXIST online.txt del online.txt 
06.
IF NOT EXIST rechner.txt ECHO Fehler ! rechner.txt nicht gefunden ! && Pause && EXIT 
07.
FOR /F "tokens=1" %%i IN (rechner.txt) DO CALL:checkPC %%i 
08.
GOTO:NEXTROUND  
09.
 
10.
:checkPC  
11.
SET "PCONLINE=0"  
12.
ECHO Check PC : %1 
13.
ping -n 1 %1 | find "TTL=" >NUL && SET "PCONLINE=1"  
14.
IF "%PCONLINE%"=="1" (   
15.
	ECHO %1>>online.txt  
16.
	ECHO PC %1 ist ON 
17.
	CALL:DO_IT %1 
18.
) ELSE (  
19.
	ECHO %1>>offline.txt 
20.
	ECHO PC %1 ist OFF 
21.
22.
GOTO:eof 
23.
 
24.
:DO_IT 
25.
ECHO PC %1 wird bearbeitet ... 
26.
REM DO Irgendwas ;-) 
27.
REM Und noch viel mehr ... 
28.
GOTO:eof 
29.
 
30.
:NEXTROUND 
31.
IF EXIST offline.txt ( 
32.
	IF EXIST rechner.txt DEL rechner.txt 
33.
	Rename offline.txt rechner.txt 
34.
	SET NEUERUNDE=1 
35.
36.
IF "%NEUERUNDE%"=="1" GOTO ANFANG 
37.
EXIT 
38.
 
In der rechner.txt ist jeweils ein Hostname pro Zeile.

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

Lobiwan
Bitte warten ..
Mitglied: miniversum
01.04.2009 um 13:09 Uhr
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
Bitte warten ..
Mitglied: bastla
01.04.2009 um 14:56 Uhr
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:
01.
@ECHO OFF & SETLOCAL 
02.
:ANFANG 
03.
SET NEUERUNDE=0 
04.
IF EXIST offline.txt del offline.txt 
05.
IF EXIST online.txt del online.txt 
06.
IF NOT EXIST rechner.txt (ECHO Fehler ! rechner.txt nicht gefunden ! & Pause & goto :eof) 
07.
FOR /F "tokens=1" %%i IN (rechner.txt) DO ( 
08.
    SET "PCONLINE="  
09.
    ECHO Check PC : %%i 
10.
    ping -n 1 %1 | find "TTL=" >NUL && SET "PCONLINE=1"  
11.
    IF DEFINED PCONLINE (   
12.
        ECHO %%i>>online.txt  
13.
        ECHO PC %%%i ist ON 
14.
        CALL:DO_IT %%i 
15.
    ) ELSE (  
16.
        ECHO %%i>>offline.txt 
17.
        ECHO PC %%i ist OFF 
18.
19.
20.
 
21.
IF EXIST offline.txt ( 
22.
    move offline.txt rechner.txt 
23.
    SET NEUERUNDE=1 
24.
25.
IF "%NEUERUNDE%"=="1" GOTO ANFANG 
26.
goto :eof 
27.
 
28.
:DO_IT 
29.
ECHO PC %1 wird bearbeitet ... 
30.
REM DO Irgendwas ;-) 
31.
REM Und noch viel mehr ... 
32.
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:
01.
... 
02.
for /f "delims=" %%i in (rechner.txt) do @ping -n 1 %%i|find "TTL=">nul && ( 
03.
    ECHO %%i>>online.txt  
04.
    ECHO PC %%i ist ON 
05.
    CALL:DO_IT %%i 
06.
) || ( 
07.
    ECHO %%i>>offline.txt 
08.
    ECHO PC %%i ist OFF 
09.
10.
...
Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Variable setzen können während timeout (3)

Frage von DontFlameMeITryMyBest zum Thema Batch & Shell ...

Windows Netzwerk
Kein RDP über VPN per MS-TSC möglich (8)

Frage von survial555 zum Thema Windows Netzwerk ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...