User since
2007-06-01
2
Artikel
BenutzerIn
hallo,
ich will mit einem skript cmd befehle eingeben.
wenn fehler erzeugt werden, brauche ich im skript die fehlernummer, damit ich entsprechen reagieren kann...
wenn man das befehl "nur so" in der cmd eingibt, wird immer eine rückmeldung angezeigt... "der befehl wurde erfolgreich durchgeführt", oder "...fehlernummer 85...".
Diese 85 brauche ich in meinem skript.
nun habe ich mich ein bisschen im internet umgeschaut, und die funktion system(). und `` gefunden.
mit `` wird behauptet, die rückgabe wird nicht mehr im standard-output angezeigt, sondern man kann sie einer variablen zuweisen. So wie ich es verstehe, sollte z.B.
$rueck = `net use P: \\\\xxxx\\xxxx xxxx /user:xxxx /persistent:no`;
in $rueck genau das speichern, was die cmd zurückgibt.
aus diesem text will ich später die fehlernummer rausfischen !
ich arbeite übrigens mit eclipse.
groÃes problem ist aber dass die cmd rückgabe weiterhin auf der console ausgegeben wird. und wenn ich
print $rueck;
versuche, kommt nichts raus.
habe ein bisschen weitergesucht, und gefunden, man müsste diese rückgabe formatieren. dafür gibt es folgenden befehl:
Win32::FormatMessage($rueck);
den gebe ich aus mit print, und es kommt immer "das befehl wurde erfolgreich beendet" raus, auch wenn es fehlermeldungen gibt.
somit erhalte ich mit
$rueck = `net use P: \\\\xxxx\\xxxx xxxx /user:xxxx /persistent:no`;
print Win32::FormatMessage($rueck);
zwei ausgaben auf der konsole, nämlich
"Systemfehler 85 aufgetreten.
Der lokale Ger&âtename wird bereits verwendet."
und unten
"Der Vorgang wurde erfolgreich beendet."
hatte eigentlich erwartet, dass der erste text in $rueck gespeichert wurde. das ist auch was ich brauche.
eigentlich nur die 85. wenn jemand weiÃ, wie ich mit dem skript an diese zahl komme (und er mir es erklärt, klar :) ), wäre mein problem gelöst.
User since
2003-08-04
14371
Artikel
ModeratorIn
Vermutlich wird die Fehlermeldung auf STDERR geschrieben. Das heißt, Du musst STDERR auf STDOUT umleiten (mit
2>&1).
Also sollte es so gehen:
$rueck = `net use P: \\\\xxxx\\xxxx xxxx /user:xxxx /persistent:no 2>&1`;
print Win32::FormatMessage($rueck);
User since
2007-06-01
2
Artikel
BenutzerIn
prima, das hat funktioniert :)
allerdings musst man das Win32::FormatMessage() auslassen... damit wird weiterhin ausgeben, dass kein fehler aufgetaucht ist.
mit print $rueck wird aber die fehlermeldung ordentlich ausgegeben.
werde jetzt die fehlernummer rausholen...
falls jemand etwas darüber weißt, wie man die fehlernummer direkt abfragen kann, mag er sich ruhig am thread beteiligen :)
in qbasic zum bespiel steht sie in einer globalen variable (ERR) immer zur verfügung.
Das ist jetzt aber windowsnäher... vielleicht kann man mit perl irgendwie rankommen?
User since
2004-07-19
1776
Artikel
HausmeisterIn
Wenn Du einen Befehl mit
system ausführst, bekommst Du den Fehlerstatus des ausgeführten Programmes als Rückgabewert. Wenn Du Backticks verwendest, ist der Fehlerstatus des Programmes
$? >> 8.
Allerdings weiß ich nicht, ob der Befehl net den Fehlercode, den er ausgibt, auch als Status zurückgibt. Falls nicht, kannst Du auf die Ausgabe ja einfach mit einem regulären Ausdruck losgehen, zum Beispiel so:
my ($errno) = $out =~ m/(\d+)/;\n\n
<!--EDIT|murphy|1180705730-->
When C++ is your hammer, every problem looks like your thumb.
User since
2003-08-04
5246
Artikel
ModeratorIn
zum Mounten von Netzlaufwerken empfehle ich
Win32::NetResource.