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, 5020 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 ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
Ä in batch Datei (12)

Frage von BergEnte zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (17)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

DSL, VDSL
DSL-Signal bewerten (14)

Frage von SarekHL zum Thema DSL, VDSL ...