Notepad++ NppExec: Die Umleitung zur Datei mit '>' registriert es als Argument und funktioniert nicht, obwohl es in der Befehlszeile funktioniert

Notepad++ NppExec: Die Umleitung zur Datei mit '>' registriert es als Argument und funktioniert nicht, obwohl es in der Befehlszeile funktioniert

Wenn man sich den folgenden Code ansieht, konvertiert er einfach eine AC- oder C++-Datei, z. B. main.cppin ihren Zustand nach der Vorverarbeitung, z. B. main_pp.cpp.

Die Ausführung des generierten Befehls g++ -E "main.cpp" > "main_pp.cpp"funktioniert jedoch problemlos in der Befehlszeile.

Der genaue Fehler ist g++: error: >: Invalid argument, also erkennt es anscheinend nicht, dass >nicht Teil der Argumentliste ist.

cd "$(CURRENT_DIRECTORY)"
g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"

Weiß jemand, warum das Verhalten in NppExec anders ist als in der Standardbefehlszeile?

Antwort1

Die Ausgabeumleitung via >und die Weiterleitung via |ist etwas, wofür der Kommandozeileninterpreter verantwortlich ist. In Windows cmd.exeist dies der Kommandozeileninterpreter. Anstatt also

g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"

benutze das:

cmd /C g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"

Antwort2

Die kurze Antwort lautet, dass der Befehlszeileninterpreter viel mehr kann, als nur andere Programme auszuführen. Dinge wie das Umleiten der Ausgabe eines Programms >oder das Weiterleiten der Ausgabe mit |sind Funktionen, die der Befehlszeileninterpreter bereitstellt. NppExec müsste diese Funktionen also simulieren, damit sie funktionieren.

Eine genauere Antwort ist, dass Sie neue Prozesse in Windows normalerweise starten mitCreateProcess()und verwandte Funktionen, und obwohl Sie die Ausgabe des neuen Prozesses umleiten können, ist dies nicht so einfach wie die Verwendung von >. Sie müsseneinen Griff öffnenin die Datei und übergeben Sie sie imSTARTUPINFOAunter Verwendung der entsprechenden Flags.

Um >die Umleitung zu unterstützen, müsste NppExec die Zeile analysieren, um diesen Teil von der Anwendung und den Parametern zu trennen, was schwierig sein kann. Außerdem müsste berücksichtigt werden, dass eine Umleitung zu anderen Dingen erfolgen kann, die keine Dateien sind, z. B. zu einem Drucker.

Es ist nicht unmöglich, und es scheint, dass NppExec einige grundlegende Analysen durchführt, da Sie in Ihrem Beispiel verwenden, cdwas auch vom Befehlszeileninterpreter bereitgestellt wird. Dies kann jedoch so einfach sein wie das Überprüfen, ob die ersten beiden Zeichen einer Zeile, die kein Leerzeichen sind, "cd" sind, und dann den Rest der Zeile zu verwenden, um zu änderndas aktuelle Verzeichnis.

Ich vermute auch, dass NppExec die Zeile nicht einmal analysiert, um die Anwendung von den Parametern zu trennen. Ich denke, es ersetzt einfach die Variablen und nutzt die Tatsache aus, dass CreateProcess()der Anwendungsparameter weggelassen werden kann, sodass es einfach die ganze Zeile als Befehlszeilenparameter übergeben kann (zumindest würde ich das tun :-).

Programme, die ihr Ergebnis einfach an die Standardausgabe ausgeben und erwarten, dass Sie es in eine Datei umleiten oder an ein anderes Programm weiterleiten, sind unter Unix/Linux typischer (g++ scheint Teil von GNU zu sein, das ursprünglich für Unix entwickelt wurde). Unter Windows ist es üblicher, einen Parameter zu verwenden, um die Ausgabedatei anzugeben. Daher ist die Unterstützung der Umleitung nichts, was Sie als oberste Priorität betrachten würden (oder überhaupt darüber nachdenken würden), wenn Sie keine Programme im „Linux-Stil“ verwenden.

verwandte Informationen