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

return codes werden in batch-datei fehlerhatft ausgewertet

Frage Microsoft Windows Tools

Mitglied: thomaskunze

thomaskunze (Level 1) - Jetzt verbinden

15.12.2008, aktualisiert 15:26 Uhr, 5048 Aufrufe, 2 Kommentare

Hallo,

ich veruche mich an meinem ersten (kleinen) script, um remote-clients herunterzufahren. Dazu nutze ich psshutdown und eine Textdatei mit den Namen der PCs. Allerdings möchte ich evt. auftretende Fehler in einer weiteren Textdatei dokumentieren, weshalb ich nicht einfach die Rechnerliste an psshutdown übergeben kann.
Meine batch-Datei auzurufen unter XP/Vista(als Administrator) - getestet unter Vista:

01.
@echo off 
02.
 
03.
if exist fehler.txt (del fehler.txt) 
04.
 
05.
For /F "tokens=1" %%a IN (rechner.txt) DO ( 
06.
 	echo. & echo Shutting down %%a: 
07.
 	psshutdown -k -c -m BLAH -t 600 \\%%a 
08.
	echo %errorlevel% 
09.
 	if errorlevel 0 (echo %%a - OK & echo %%a - OK >> fehler.txt) else (echo %%a - Fehler: %errorlevel% & echo %%a - Fehler: %errorlevel% >> fehler.txt) 
10.
11.
pause 
12.
exit
Mein Problem: Obwohl psshutdown "sinnvolle" return codes ausgibt (0 bzw. 1), liefert obiges script immer ein OK zurück auch wenn ich nicht existierende Rechner in der Liste stehen habe.

IMO müsste das script doch so stimmen oder nicht?

Vielen Dank für jede Erklärung/Tip!


Ausgabe der Batchdatei (der Rechner "zwerg" existiert, "26" nicht):

01.
D:\!Tools\PsTools>test.bat 
02.
 
03.
Shutting down zwerg: 
04.
 
05.
PsShutdown v2.52 - Shutdown, logoff and power manage local and remote systems 
06.
Copyright (C) 1999-2006 Mark Russinovich 
07.
Sysinternals - www.sysinternals.com 
08.
 
09.
Local system is scheduled to power off in 00:10:00. 
10.
 
11.
12.
zwerg - OK 
13.
 
14.
Shutting down 26: 
15.
 
16.
PsShutdown v2.52 - Shutdown, logoff and power manage local and remote systems 
17.
Copyright (C) 1999-2006 Mark Russinovich 
18.
Sysinternals - www.sysinternals.com 
19.
 
20.
Couldn't access 26: 
21.
Der Netzwerkpfad wurde nicht gefunden. 
22.
 
23.
Make sure that the default admin$ share is enabled on 26. 
24.
 
25.
If 26 is already performing a shutdown operation you must 
26.
abort it before issuing a different command. 
27.
 
28.
29.
26 - OK 
30.
Drücken Sie eine beliebige Taste . . .
An der Konsole hingegen:

01.
D:\!Tools\PsTools>psshutdown -k -c -m BLAH -t 600 \\zwerg 
02.
 
03.
PsShutdown v2.52 - Shutdown, logoff and power manage local and remote systems 
04.
Copyright (C) 1999-2006 Mark Russinovich 
05.
Sysinternals - www.sysinternals.com 
06.
 
07.
Local system is scheduled to power off in 00:10:00. 
08.
 
09.
 
10.
 
11.
D:\!Tools\PsTools>echo %errorlevel% 
12.
 
und

01.
D:\!Tools\PsTools>psshutdown -k -c -m BLAH -t 600 \\26 
02.
 
03.
PsShutdown v2.52 - Shutdown, logoff and power manage local and remote systems 
04.
Copyright (C) 1999-2006 Mark Russinovich 
05.
Sysinternals - www.sysinternals.com 
06.
 
07.
Couldn't access 26: 
08.
Der Netzwerkpfad wurde nicht gefunden. 
09.
 
10.
Make sure that the default admin$ share is enabled on 26. 
11.
 
12.
If 26 is already performing a shutdown operation you must 
13.
abort it before issuing a different command. 
14.
 
15.
 
16.
D:\!Tools\PsTools>echo %errorlevel% 
17.
1
Edit: Formatierung angepasst
Mitglied: Biber
15.12.2008 um 15:13 Uhr
Moin thomaskunze,

willkommen im Forum.
3 Tipps zu Deinem Schnipsel:
1) am besten < code >-Formatierung benutzen - siehe "Formatierungshilfe" beim Editieren oder in den FAQ

Problem ist, dass alles innerhalb einer FOR-Anweisung bis zur letzten schließenden KlammerZu vom CMD als EINE Codezeile aufgefasst wird und darin auch alle Variablen nur einmalig "errechnet"/aufgelöst werden. Nämlich am Beginn der Verarbeitung. Wenn die CMD.exe das Wort FOR liest sozusagen. Und deshalb hat auch %errorlevel% den Wert, den es schon beim ersten Lesen dieses Wortes hatte.

2) Workaround I
01.
@echo off & setlocal enableDelayedExpansion 
02.
 
03.
if exist fehler.txt (del fehler.txt) 
04.
 
05.
For /F "tokens=1" %%a IN (rechner.txt) DO ( 
06.
    echo. & echo Shutting down %%a: 
07.
    psshutdown -k -c -m BLAH -t 600 \\%%a 
08.
    if not errorlevel 1 ( 
09.
         echo %%a - OK  
10.
         echo %%a - OK >> fehler.txt 
11.
    ) else (  
12.
        echo %%a - Fehler: !errorlevel!  
13.
        echo %%a - Fehler: !errorlevel! >> fehler.txt) 
14.
15.
 pause 
16.
exit
3) Workaround II - mit Call:Block
01.
@echo off 
02.
 
03.
if exist fehler.txt (del fehler.txt) 
04.
 
05.
For /F "tokens=1" %%a IN (rechner.txt) DO call :brezeldown %%a 
06.
 pause 
07.
exit 
08.
goto :eof 
09.
 
10.
:brezeldown Parameter %1 ist der Rechnername/IP (vorher %%a) 
11.
echo. 
12.
echo Shutting down %1: 
13.
psshutdown -k -c -m BLAH -t 600 \\%1 
14.
if errorlevel 1 ( 
15.
        echo %1 - Fehler: %errorlevel%  
16.
        echo %1 - Fehler: %errorlevel% >> fehler.txt) 
17.
        goto :eof 
18.
19.
:: else-Fall: Errorlevel war NICHT 1 oder höher 
20.
   echo %1 - OK  
21.
   echo %1 - OK >> fehler.txt 
22.
goto :eof
Grüße
Biber
[Edit] Tippfehlerkorrektur, [/Edit]
Bitte warten ..
Mitglied: thomaskunze
15.12.2008 um 15:26 Uhr
Vielen Dank für die prompte Antwort! Ich werde Deine Vorschläge gerne ausprobieren!

Viele Grüße,

Tom

Edit: Es hat (natürlich) geklappt. Nochmals vielen Dank!
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
gelöst Powershell - WMI Return Codes unterdrücken, WIE? (3)

Frage von instinctless zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch generieren mit einer ID oder Namen die Code enthält (2)

Frage von TicoWrite zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch : alle Dateien eines Ordners bearbeiten (1)

Frage von deguonkel zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Datei: PDF Dateien verschieben, umbenennen und löschen (4)

Frage von F0rcehunter zum Thema Batch & Shell ...

Neue Wissensbeiträge
Windows Tools

Zeit für Energiesparmodus, Bildschirmabschaltung etc. schnell anpassen

Anleitung von hannsgmaulwurf zum Thema Windows Tools ...

Linux Netzwerk

Ping und das einstellbare Bytepattern

(1)

Erfahrungsbericht von LordGurke zum Thema Linux Netzwerk ...

Windows Update

Microsoft Update KB4034664 verursacht Probleme mit Multimonitor-Systemen

(4)

Tipp von beidermachtvongreyscull zum Thema Windows Update ...

Heiß diskutierte Inhalte