Ich versuche also zu laufen foo.exe
, aber ich möchte nicht, dass die Ausgabe an das Terminal, sondern in eine Datei erfolgt. Laufen foo.exe > foo.txt
sollte dies für mich erreichen, ist es aber nicht. Wenn ich die exe-Datei ausführe, erhalte ich die Ausgabe. Die Exe funktioniert also gut. Wenn ich jedoch versuche, die Ausgabe an eine Datei zu senden, erhalte ich nur Folgendes:
'c:/Program' is not recognized as an internal or external command,
operable program or batch file.
Dies wird nur angezeigt, wenn ich versuche, es an eine Datei zu senden. Da ich dachte, dass es der Pfad (der ist c:\Program Files (x86)\
usw.) sein könnte, der falsch interpretiert wird, habe ich versucht, die Ausgabedatei so anzugeben: foo.exe > c:\test.txt
aber immer noch keine Freude.
Kann ich, abgesehen von der Feststellung, dass die Binärdatei, die ich ausführen möchte, schlecht geschrieben ist, irgendetwas tun, um dies zu beheben? Denken Sie daran, dass ich beim Ausführen der Exe eine gültige Ausgabe erhalte. Sie wird einfach nicht gut in eine Datei gedruckt. Offensichtlich ist die Ausgabe da, die Frage ist, ob es eine Möglichkeit gibt, sie zu fangen.
quelle
Antworten:
Sie haben den von Ihnen verwendeten Befehl nicht angezeigt, der fehlschlägt. Wenn Sie es in Ihrer Frage zeigen, ist es möglicherweise einfacher, eine Lösung für Sie zu finden.
Ich gehe davon aus, dass Ihr Befehl ungefähr so lautet:
Der Fehler, den Sie erhalten, ist ein Hinweis:
Zuerst:
... is not recognized as an internal or external command, operable program or batch file.
Dies geschieht normalerweise, wenn Sie versuchen, mit a
|
anstelle von a zu einer Datei umzuleiten>
.Zweite:
'c:/Program' ...
Wenn Sie einen Dateinamen (oder Pfad) angeben, der Leerzeichen enthält, müssen Sie ihn in doppelte Anführungszeichen (
"..."
) setzen. Dies liegt daran, dass das Betriebssystem beim Festlegen der Datei, zu der umgeleitet werden soll, nicht mehr nach dem Dateinamen sucht, wenn es auf ein nicht angegebenes Leerzeichen stößt :"c:/Program"
.Versuche dies:
Wenn das oben Gesagte nicht funktioniert, um die Ausgabe aus
foo.exe
der Textdatei zu erfassen , gibt es eine andere Möglichkeit ...Wenn das Programm
foo.exe
seine AusgabeSTDERR
anstelle von schreibtSTDOUT
, wird die Ausgabe vonfoo.exe
nicht durch einfache Umleitung mit einer einzelnen erfasst>
. Sie müssten es so machen:Bearbeiten:
Hier finden Sie eine Erläuterung der Dateiumleitung und der
2>&1
Notation.Wenn ein Programm in das Terminal schreibt, kann es in eines von zwei schreiben
Streams
.Stream 1 wird als
STDOUT
oder Standardausgabe bezeichnet . Normalerweise schreiben Programme ihre "normale" Ausgabe in Stream 1.Stream 2 wird als
STDERR
oder Standardfehler bezeichnet . Normalerweise schreiben Programme ihre "Fehler" -Ausgabe (Fehler- und Warnmeldungen) in Stream 2.Ob ein Programm eine bestimmte Ausgabe in den Programmierer schreibt
STDOUT
oder von diesemSTDERR
bestimmt wird und wie er das Programm geschrieben hat. Einige Programme sind so geschrieben, dass sie alle Ausgaben (normale Ausgaben und Fehler) an sendenSTDOUT
.Wenn ein Programm ohne Ausgabeumleitung ausgeführt wird, werden alle normalen und Fehlerausgaben an den Terminalbildschirm gesendet, ohne dass zwischen
STDOUT
Ausgabe undSTDERR
Ausgabe unterschieden wird.Wenn Sie eine "normale" Umleitung mit einer Single
>
wie dieser durchführen:Sie geben nicht an, welcher Stream in die Datei umgeleitet wird, daher wird Stream 1 angenommen.
Es ist das gleiche, als ob Sie es so eingegeben hätten:
Dies weist den Befehlsinterpreter (
cmd.exe
) an, die Programmausgabe fürSTDOUT
(Stream 1) unter dem angegebenen Dateinamen zu erfassen . Das1
in1>
bezieht sich auf Stream 1.In diesem Fall wird das gesamte normale Programm in die Datei aufgenommen. Wenn das Programm jedoch in
STDERR
(Stream 2) schreibt , wird diese Ausgabe nicht erfasst und auf dem Bildschirm angezeigt. Dies ist im Allgemeinen die "gewünschte" Methode, damit Sie während der Erfassung der normalen Programmausgabe auf dem Bildschirm sehen können, ob ein Fehler auftritt.Wenn Sie die Ausgabe "Normal" in eine Datei und die Ausgabe "Fehler" in eine andere Datei erfassen möchten, gehen Sie folgendermaßen vor:
Wenn Sie möchten, dass die Ausgabe "Normal" und die Ausgabe "Fehler" in derselben Datei erfasst werden, können Sie dies wie folgt angeben:
Dies ist im Grunde eine "Kurzform" für die Angabe und bedeutet, Stream 1 in die angegebene Datei umzuleiten und Stream 2 an denselben "Ort" (Datei) wie Stream 1 umzuleiten .
Bearbeiten:
Pacerier fragte:
Kurze Antwort: Sie würden denken, dass sie identisch sind, aber nein. Sie sind anders.
Bei Umleitung mit
>"filename.ext"
,1>"filename.ext"
oder2>"filename.ext"
,>
wird die Ausgabe in eine neue Datei mit dem Namen "filename.ext" geschrieben. Wenn die Datei "filename.ext" bereits vorhanden ist, wird sie zuerst gelöscht.Also mit:
foo.exe> "c: \ output.txt" 2> "c: \ output.txt"
verursacht einen "Konflikt", bei dem beide Umleitungen versuchen, in dieselbe Datei zu schreiben, und beide versuchen, die Datei zu löschen, falls sie bereits vorhanden ist. Dies wird wahrscheinlich zu unerwünschtem Verhalten führen. Im Allgemeinen werden der eine oder der andere oder beide Ausgänge NICHT vollständig oder vorhersehbar erfasst.
Das tatsächliche Ergebnis hängt vom Betriebssystem und der Version ab und kann auch vom ausgeführten Befehl abhängen. Was wahrscheinlich passieren wird, ist:
1 Die an eine der Umleitungen gesendete Ausgabe wird erfasst oder teilweise erfasst, und die an eine andere Umleitung gesendete Ausgabe geht verloren. 2 Das Betriebssystem beschwert sich über den Befehl und keiner der Ausgänge wird (vollständig) erfasst. 3 Undefiniertes, unerwünschtes, unvorhersehbares, unerwartetes Verhalten.
Unter Windows 7 und wahrscheinlich unter Windows Vista / 8/10 und möglicherweise unter Windows XP beschwert sich das Betriebssystem über den Befehl und der Befehl wird abgebrochen.
Zum Beispiel (Windows 7): Ich habe einen Ordner mit dem Namen:
"C:\Temp\emptyfolder"
und eine Datei mit dem Namen "nonexistantfile" existiert dort nicht.In diesem Fall wird mit einer Umleitung (
>output.txt
) die Ausgabe desdir
Befehls in der Datei erfasst:output.txt
und die FehlermeldungFile Not Found
wird auf dem Bildschirm angezeigt. Dies ist das erwartete Verhalten.Verwenden Sie nun beide Umleitungen ("> Datei" UND "2> Datei"):
In diesem Fall hat das Betriebssystem beanstandet, dass die (Outout-) Datei bereits verwendet wird. Die Datei "output.txt" ist leer (0 Byte) und die Ausgabe für beide Umleitungen ging verloren.
Verwenden Sie zum Schluss beide Umleitungen ("> Datei" UND "2> & 1"):
In diesem Fall bewirkt "> Datei", dass die Ausgabe für "Stream 1" ("Standardausgabe") in der Datei erfasst wird. Und "2> & 1" bewirkt, dass die Ausgabe für "Stream 2" ("Fehlerausgabe") über den bereits umgeleiteten "Stream 1" gesendet und auch in die (gleiche) Datei erfasst wird.
Es ist auch erwähnenswert, dass die Reihenfolge wichtig ist. Umkehren der Reihenfolge wie folgt:
ist nicht dasselbe und wird Ihnen wahrscheinlich nicht das gewünschte Ergebnis liefern.
In diesem Fall bewirkt "2> & 1", was zuerst gesehen und verarbeitet wird, dass die Ausgabe für "Stream 2" ("Fehlerausgabe") an die Stelle umgeleitet wird, an die "Stream 1" aktuell geleitet wird, und zwar zu diesem Zeitpunkt Moment ist (standardmäßig) der Bildschirm. Und "> Datei" bewirkt, dass die Ausgabe für "Stream 1" ("Standardausgabe") in der Datei erfasst wird. Das Endergebnis ist, dass die Ausgabe des Befehls ("Stream 1") in der Datei erfasst wird, die Fehlerausgabe ("Stream 2") jedoch weiterhin auf dem Bildschirm angezeigt wird (nicht in der Datei).
quelle
foo.exe>"c:\test.txt"
tatsächlich funktionierte, aber es gab einen Fehler, dass das Programm abstürzte (die Ausgabe war jedoch immer noch da). Ihr Vorschlag machte es jedoch noch besser, als2>&1
die Crash-Beschwerde verschwand. Möchten Sie näher erläutern, was es tut? Nochmals vielen Dank für eine tolle Antwort.2>&1
. Wenn Sie Ihre Datei "c: \ test.txt" untersuchen, werden Sie höchstwahrscheinlich feststellen, dass die " Absturzbeschwerde" in die Datei geschrieben wurde.2>&1
Sollte das Programm nicht zum Absturz bringen oder verhindern, werden lediglich die Fehlermeldungen erfasst und nicht angezeigt.'for some reason it does'
Inwiefern ist die Umleitung davon betroffen? Wollen Sie damit sagen2>&1
, dass der Fehler nicht auftritt , wenn Sie einschließlich umleiten ? Welche Fehlermeldung wird angezeigt, wenn der Fehler auftritt?2>&1
es nicht enthalten ist, stürzt das Programm ab und ich erhalte das Standard-Windows-Dialogfeld "Dieses Programm reagiert nicht mehr". Wenn ich es einbinde, tut es das nicht. Keine Ahnung warum. In beiden Fällen wird jedoch eine Ausgabe generiert.