Notepad++ NppExec:使用「>」重定向到檔案將其註冊為參數並且不起作用,即使它在命令列上起作用

Notepad++ NppExec:使用「>」重定向到檔案將其註冊為參數並且不起作用,即使它在命令列上起作用

看下面的程式碼,它只是將 ac 或 c++ 檔案轉換main.cpp為預處理後的狀態,例如main_pp.cpp

但是,運行它生成的命令g++ -E "main.cpp" > "main_pp.cpp"在命令行上運行得很好。

確切的錯誤是g++: error: >: Invalid argument,所以顯然它沒有看到 不是>參數列表的一部分。

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

有誰知道為什麼 NppExec 中的行為與標準命令列不同?

答案1

輸出重定向via>和管道via|是命令列解釋器負責的事情。在Windows中,cmd.exe是命令列解釋器。所以,而不是

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

用這個:

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

答案2

簡而言之,命令列解釋器所做的不僅僅是執行其他程序,並且使用命令列解釋器提供的功能來重定向程式的輸出>或透過管道傳輸輸出之類的事情|,因此 NppExec 需要在為了工作。

更準確的答案是,您通常會使用以下命令在 Windows 中啟動新進程CreateProcess()和相關函數,儘管您可以重定向新進程的輸出,但這並不像使用>.你需要打開一個手柄到文件並將其傳遞到STARTUPINFOA使用適當的標誌。

因此,為了支援>重定向,NppExec 需要解析該行以將該部分與應用程式和參數分開,這可能很棘手,而且還需要考慮到您可以重定向到不是檔案的其他內容,例如一台印表機。

這並非不可能,而且 NppExec 似乎做了一些基本的解析,因為在您的範例中您使用的cd也是由命令列解釋器提供的。但這可以很簡單,只需檢查一行的前兩個非空格字元是否為“cd”,然後使用行的其餘部分進行更改目前目錄

我還懷疑 NppExec 甚至不解析該行以將應用程式與參數分開。我認為它只是替換變數並利用CreateProcess()允許省略應用程式參數的事實,因此它可以將整行作為命令列參數傳遞(至少這是我會做的:-)。

最後,在Unix/Linux 中更常見的是,僅將結果輸出到標準輸出並期望將其重定向到檔案或透過管道傳輸到另一個程式的程式(g++ 似乎是最初為Unix 建立的GNU 的一部分) 。在 Windows 中更常見的是使用參數來指定輸出文件,因此如果您不使用「Linux 風格」程序,那麼支援重新導向並不是您認為的首要任務(甚至根本不會考慮它)。

相關內容