如何在MSBuild Exec任务中隐藏命令并避免在控制台输出?

6

我在我的MSBuild文件中有一个任务,如下所示:

<Exec command="net use $(DeploymentServerName) /user:username passwd" ContinueOnError="false" />

但是在控制台输出中,它将会显示命令:

...
net use $(DeploymentServerName) /user:username passwd
...

但如果有可能,我希望隐藏凭据。我不关心命令的输出去了哪里,我只关心命令本身不会在控制台上显示。 有什么想法吗?

2个回答

17

从 .NET 4.0 开始,Exec MSBuild 任务得到了 EchoOFF 属性,可以完全抑制命令本身的回显(不是命令输出)。完整文档在这里。只需将 EchoOff="true" 添加到 Exec 属性列表中即可。


这是答案。 - Anton K
哇,我好久没来看这个问题了,我会再次检查一下并看看它是否适用于我,并切换答案,因为它看起来更简单... - peterw

1

有几种可能的方法,这里介绍其中一种

<Target Name="DoHideCommand">
  <Exec Command="MSBuild $(MsBuildThisFile) /t:SpecialCommand /nologo /noconsolelogger"/>
</Target>

<PropertyGroup>
  <MyCommand>dir c:</MyCommand>
</PropertyGroup>  

<Target Name="SpecialCommand">
  <Exec Command="dir"/>
</Target>

这会调用一个单独的msbuild进程来执行实际的目标,并隐藏所有输出结果。

...
DoHideCommand:
  MSBuild test.targets /t:SpecialCommand /nologo /noconsolelogger
...

And here is another one

<Target Name="SpecialCommandViaFile">
  <PropertyGroup>
    <TmpFile>tmp.bat</TmpFile>
  </PropertyGroup>
  <WriteLinesToFile File="$(TmpFile)" Lines="$(MyCommand)"/>
  <Exec Command="$(TmpFile) > NUL 2>&amp;1" WorkingDirectory="$(MsBuildThisFileDirectory)"/>
  <Delete Files="$(TmpFile)"/>
</Target> 

这将创建一个批处理文件来运行实际命令,然后将所有输出重定向到 NUL,以便只显示此内容。
...
SpecialCommandViaFile:
tmp.bat > NUL 2>&1
Deleting file "tmp.bat".
...

请注意,执行你的msbuild文件的人总是可以简单地打开你的文件查看凭据,即使在运行时从输出中隐藏它们。

@IlyaKozhevnikov没有一个蝙蝠,它只能压制命令的输出,而不是命令本身。&gt;等都是可选的,>同样可行。 - stijn
我使用了高级思路,通过执行另一个目标来完成。我将目标命名为一些有信息量的名称,这样在输出中我仍然知道正在发生的步骤,但不包括实际的细节。谢谢! - peterw

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