MSBuild Exec命令始终失败

时间:2016-12-19 16:53:46

标签: msbuild

我试图从MSBuild(VS2015,来自.target文件)执行这个简单命令来生成当前git提交的日期:

git show -s --format=%cd --date=format:%d.%m.%Y

所以在MSBuild中我尝试过:

<Exec Command="git show -s --format=%25cd --date=format:%25d.%25m.%25Y"  ConsoleToMSBuild="true">
  <Output TaskParameter="ConsoleOutput" PropertyName="BuildDate" />
</Exec>

但它只会产生错误:

1>------ Build started: Project: example, Configuration: Release Dll Win32 ------
1>  fatal: invalid --pretty format: d.Y
1>D:\example\gitversion.targets(26,5): error MSB3073: The command "git show -s --format=%cd --date=format:%d.%m.%Y" exited with code 128.

如果我在引号中将命令发布到控制台,它就像一个魅力并打印19.12.2016

我尝试了以下事项:

  • 同时逃离=标志,:,......仍然无效

  • 仅使用Command="git show -s --format=%25ci" - &gt;产生错误fatal: invalid --pretty format: ci但在控制台中工作正常。

  • 使用引号&quot;--format=%25ci&quot;环绕 - >同样的错误

  • 使用Command="git --version"调用,这可以正常工作并返回git版本(与控制台上相同)

我怀疑它以某种方式不接受=来指定参数,但是git不会让我将它作为单独的参数传递,例如被空格隔开。

2 个答案:

答案 0 :(得分:3)

您希望%25转义%,因此您的命令将变为

<Exec Command="git show -s --format=%25%25cd --date=format:%25%25d.%25%25m.%25%25Y" ConsoleToMSBuild="true">
  <Output TaskParameter="ConsoleOutput" PropertyName="BuildDate" />
</Exec>

请参阅此处查看MSBuild escape characters

答案 1 :(得分:0)

另一个答案对我有帮助,但我有一个稍微复杂的情况。这是我自己的解决方案,有一些补充说明:

<Exec Command="git log -1 --oneline --pretty=&quot;%25%25h %25%25ad &lt;%25%25ae&gt;&quot; &gt; $(OutputPath)/git-info.txt" />

这将执行此命令:

git log -1 --oneline --pretty='%h %ad <%ae>' > bin/debug/git-info.txt

以下是我理解为什么需要每次逃生的原因: