使用msbuild中的Exec任务抑制输出

6
我正在使用msbuild的“Exec”任务运行命令。然而,我不希望命令生成的stdio输出出现在控制台上,有没有办法来抑制它?
也许可以通过使用Exec任务调用“cmd.exe”并将我的命令exe作为目标,然后使用“>”将输出重定向到其他地方。但是我无法使此解决方案工作。
即:
<Exec Command="cmd.exe sqlplus.exe  $(someCommandSpecificSettings) &lt; test.txt"/>

有什么建议可以让我的示例运行起来,或者有其他的替代方案吗?
4个回答

15

抑制 Exec 任务或从ToolTask继承的任何任务的标准输出和标准错误输出的最佳方法是降低输出的重要性。这样,如果您正在调试构建过程,则不会完全隐藏这些输出,因为它们被重定向到“nul”。

<Exec Command="sqlplus.exe" StandardOutputImportance="low" StandardErrorImportance="low"/>

1
这是一个很棒的答案!在Windows和*nix上都可以工作,正好符合我的需求 - 在正常情况下抑制输出,但保留它以进行调试。太棒了! - Oliver
正是我所需要的,谢谢。 - Kieran Foot

10

仅供参考:

  • ( &gt;) 将输出重定向到指定的文件中(如果需要会覆盖原有内容)

  • 将输出添加到指定文件的末尾(不会覆盖原有内容)

  • < 将标准输入重定向为命令中的文件内容(基本上将文件内容传递给命令)

对于您的代码,您每次都创建并替换test.txt文件。您可以使用NUL代替文件名,表示重定向到无处。这样就不会创建文件(在某些情况下可能会很大):

<Exec Command="cmd.exe /c sqlplus.exe  $(someCommandSpecificSettings) &gt; NUL"/>

如果您想将错误信息一并重定向,可以使用2>语法如下:

<Exec Command="cmd.exe /c sqlplus.exe  $(someCommandSpecificSettings) &gt; NUL 2&gt;errors.txt"/>

还要注意,你可以使用 2>&1 将 stderr 重定向到 stdout,因此

> NUL 2>&1

会将所有东西都重定向到无处。

希望这能让您清晰明了 ^^


1
警告:将重定向到“NUL”仅适用于Windows,而不适用于Linux。 - starbeamrainbowlabs
@starbeamrainbowlabs 感谢您非常有帮助的评论! - Oliver
虽然这个答案在Windows上可以工作,但是如果你只想在“正常”情况下抑制输出但仍然保持在调试时可见的话,请考虑@Xacron的答案。他的答案链接为:https://dev59.com/ZlLTa4cB1Zd3GeqPanr_#48306223 - Oliver

2

好的,问题解决了... cmd.exe需要一个/c参数才能按照我想要的方式工作,即:

另外,应该使用&gt;而不是&lt;

<Exec Command="cmd.exe /c sqlplus.exe  $(someCommandSpecificSettings) &gt; test.txt"/>

0

试试这个:

<Exec Command="cmd.exe sqlplus.exe  $(someCommandSpecificSettings) &lt; test.txt >nul"/>

不行,还是不起作用..我仍然收到“系统找不到指定的文件”的消息。 - vicsz
那个错误提示告诉你找不到'test.txt'作为输入进行读取,因为你错写了&lt - Jay Bazuzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接