14634
Goto Top

For schleife mit 2 befehlen ausführen?

HAllo, ich habe folgenden quellcode schnipsel den ich in eine for schleife integrieren will:

for /F %%a IN (XXX.txt) do call psexec.exe \\%%a -c deltemp.bat
set S={ERR} DELETE TEMP %%a ERRORLEVEL is %ERRORLEVEL% &CALL :LOG


hier wird eine XXX.txt genommen die PC namen beinhaltet und mit deltemp.bat bearbeitet.
Dies funzt auch soweit sehr gut.
Da es sein kann das einige Rechner aus sind bzw nicht am Netz hängen, habe ich eine Errorlevel ausgabe hinzugefügt.

Problem bei dieser konstalation ist das die erste zeile einmal beim start ausgeführt wird und eben die XXX.txt abarbeitet, die Errorlevel zeile zeigt mir deswegen nur einen PC im Log an da diese auch nur einmal ausgeführt wird aber eben dann nicht weiß das die erste zeile weiter mit XXX.txt arbeitet!

Ich habe gedacht das man hier eine FOR bzw IF schleife einbauen kann, wo beim durchgang der beiden zeilen genau 1 PC mit der deltemp bearbeitet wird und ich deswegen einen sauberen Log bekomme, oder?? face-confused

kann hier jemand evt helfen eine gescheide IF bzw FOR schleife zu generieren??

die if bzw for formel muss auch quasi wissen, wie viel pc noch in der liste nicht abarbeitet sind...

Vielen Dank

Content-Key: 152575

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

Printed on: April 26, 2024 at 00:04 o'clock

Member: BigWim
BigWim Oct 07, 2010 at 14:04:16 (UTC)
Goto Top
ungetestet würde ich so probieren:

for /F %%a IN (XXX.txt) do call :Machwas %%a
goto :eof

:Machwas
REM %%a wird zu %1
ping -n 1 %1 >NUL:
if %errorlevel% neq 0 (
   echo %1 ist aus
) else (
    call psexec.exe \\%%a -c deltemp.bat 
    set S={ERR} DELETE TEMP %%a ERRORLEVEL is %ERRORLEVEL% &CALL :LOG
)
goto :eof

Nicht alles als Einzeiler zu machen ist sicherlich eine Geschmacksfrage ...

Markus
Mitglied: 14634
14634 Oct 08, 2010 at 05:53:09 (UTC)
Goto Top
HAllo, danke für deine Hilfe, wenn ich deinen Code ausführe bekomme ich in der Log folgendes:

- ERRORLEVEL 0 %a
- ERRORLEVEL 0 %a
- ERRORLEVEL 0 %a

%a sollte für die Rechnernamen stehen.

Errorlevel 0 kann leider auch nciht sein, weil ich 2 "Tote" rechner hinterlegt habe, damit ich einen Errorlevel bekomme.

wieso stellt er alles auf errorlevel 0 ?!

ich will eben auch das er mit die PC mit errorlevel 0 in den log reinschreibt

edit:

kann es sein das im Code was nicht stimmt, ich bekomme folgende rückmeldung im DOS fenster:

Couldn't access a:
Der Netzwerkpfad wurde nicht gefunden.
Member: BigWim
BigWim Oct 08, 2010 at 07:31:50 (UTC)
Goto Top
Zitat von @14634:
kann es sein das im Code was nicht stimmt, ich bekomme folgende rückmeldung im DOS fenster:
Ja, sorry. Mal eben ist nie gut in unserem Bereich

ich habe Deine Zeile natürlich nicht bis zum Ende bearbeitet. Aus %%a wird %1. Der Call-Befehl wirkt wie ein Batch-Aufruf nur mit dem Unterschied, dass keine andere *.cmd aufgerufen wird, sondern eine Subroutine innerhalb der *.cmd. Das Goto :eof bewirkt dann, dass an der aufrufenden Stelle "weiter gemacht" wird.

Also, aus

    call psexec.exe \\%%a -c deltemp.bat 
    set S={ERR} DELETE TEMP %%a ERRORLEVEL is %ERRORLEVEL% &CALL :LOG

wird

    call psexec.exe \\%1 -c deltemp.bat 
    set S={ERR} DELETE TEMP %1 ERRORLEVEL is %ERRORLEVEL% &CALL :LOG


ich will eben auch das er mit die PC mit errorlevel 0 in den log reinschreibt
Ja, das Muster habe ich aus meiner CMD kopiert. Wenn in jedem Fall protokolliert wird, lass das IF ELSE weg, also so:

for /F %%a IN (XXX.txt) do call :Machwas %%a
goto :eof

:Machwas
REM %%a wird zu %1
call psexec.exe \\%1 -c deltemp.bat 
set S={ERR} DELETE TEMP %1 ERRORLEVEL is %ERRORLEVEL% &CALL :LOG
goto :eof


Markus