如何从控制台输出中隐藏我在MSBuild Exec任务中使用的命令?

pet*_*erw 5 msbuild msbuild-task

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

<Exec command="net use $(DeploymentServerName) /user:username passwd" ContinueOnError="false" />
Run Code Online (Sandbox Code Playgroud)

但在控制台输出中它将转储命令:

...
net use $(DeploymentServerName) /user:username passwd
...
Run Code Online (Sandbox Code Playgroud)

但是如果可能的话,我想隐藏凭据.我不关心命令输出的位置,我只关心命令本身没有回显到控制台.有任何想法吗?

Kon*_*man 14

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


sti*_*ijn 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>
Run Code Online (Sandbox Code Playgroud)

这会调用一个单独的 msbuild 进程来调用实际目标,并隐藏所有输出,从而导致

...
DoHideCommand:
  MSBuild test.targets /t:SpecialCommand /nologo /noconsolelogger
...
Run Code Online (Sandbox Code Playgroud)

这是另一张

<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> 
Run Code Online (Sandbox Code Playgroud)

这将创建一个批处理文件来运行实际命令,然后将所有输出重定向到 NUL,因此仅显示以下内容:

...
SpecialCommandViaFile:
tmp.bat > NUL 2>&1
Deleting file "tmp.bat".
...
Run Code Online (Sandbox Code Playgroud)

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