Notepad++ NppExec:使用‘>’重定向到文件将其注册为参数并且不起作用,即使它在命令行上运行

Notepad++ NppExec:使用‘>’重定向到文件将其注册为参数并且不起作用,即使它在命令行上运行

查看下面的代码,它只是将 c 或 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

输出重定向>和管道传输|都是由命令行解释器负责的。在 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++ 似乎是 GNU 的一部分,而 GNU 最初是为 Unix 创建的)。在 Windows 中,更常见的是使用参数来指定输出文件,因此如果您不使用“Linux 风格”的程序,支持重定向并不是您认为的首要任务(甚至根本不会考虑)。

相关内容