Schrift
[thread]4465[/thread]

cmd- laufwerk einbinden, fehler auffangen



<< >> 5 Einträge, 1 Seite
lolz
 2007-06-01 16:06
#37563 #37563
User since
2007-06-01
2 Artikel
BenutzerIn
[default_avatar]
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.
renee
 2007-06-01 16:28
#37564 #37564
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Vermutlich wird die Fehlermeldung auf STDERR geschrieben. Das heißt, Du musst STDERR auf STDOUT umleiten (mit 2>&1).

Also sollte es so gehen:

Code (perl): (dl )
1
2
$rueck = `net use P: \\\\xxxx\\xxxx xxxx /user:xxxx /persistent:no 2>&1`;
print Win32::FormatMessage($rueck);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
lolz
 2007-06-01 16:54
#37565 #37565
User since
2007-06-01
2 Artikel
BenutzerIn
[default_avatar]
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?
murphy
 2007-06-01 17:48
#37566 #37566
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
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.
Strat
 2007-06-02 11:22
#37567 #37567
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
zum Mounten von Netzlaufwerken empfehle ich CPAN:Win32::NetResource.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 5 Einträge, 1 Seite



View all threads created 2007-06-01 16:06.