为什么我的MSBuild执行命令失败

本文关键字:命令 失败 执行 MSBuild 我的 为什么 | 更新日期: 2023-09-27 18:14:23

我有一个非常简单的设置,我用来测试这个应用程序:

 -Solution in VS
   -Project for cs code (named Client)
   -Project for Thrift files( named Thrift)
   -Folder for Erlang Code(Doesn't show up in VS)

我的想法是,我将构建Thrift项目,让它生成两种语言的代码,将生成的erlang代码复制到正确的目录(使用MSBuild,但首先要做的是),并将生成的csharp代码包含在Thrift项目中。要做到这一点,我有以下"BeforeBuild"目标:

<Target Name="BeforeBuild">
<Exec Command="cmd /c &quot;C:'Windows'System32'thrift.exe&quot; -gen erl -gen csharp *.thrift" />
<ItemGroup>
  <CSFile Include="$(SolutionDir)gen-csharp'*" />
</ItemGroup>

我得到错误"'C:'Windows'System32'thrift.exe'不被识别为内部或外部命令,可操作的程序或批处理文件"。

我尝试Command="thrift…",因为thrift在我的PATH中,但发现MSBuild没有从PATH变量中找到程序。

注意:使用没有"cmd/c"的命令会导致相同的错误消息,但错误代码不同(9001,因为MSBuild无法找到文件,而不是"cmd/c"无法找到文件)。

编辑:为了后代,工作结果是:

<Project>
...
(Auto generated data)
...
    <PropertyGroup>
  <CleanDependsOn>
      $(CleanDependsOn);
      CleanThriftGen;
  </CleanDependsOn>
  <ErlangProjectSrcDir>$(SolutionDir)Server'src'gen'</ErlangProjectSrcDir>
  <GenCSharpDir>gen-csharp'</GenCSharpDir>
  <GenErlDir>gen-erl'</GenErlDir>
  <ThriftDir>C:'thrift'</ThriftDir>
</PropertyGroup>
<Target Name="BeforeBuild">
  <Exec Command="$(ThriftDir)thrift.exe -gen erl -gen csharp *.thrift" />
</Target>
<Target Name="AfterBuild">
  <ItemGroup>
    <ErlangSrcGroup Include="$(GenErlDir)**'*.*" />
  </ItemGroup>
  <Copy SourceFiles="@(ErlangSrcGroup)" DestinationFiles="$(ErlangProjectSrcDir)%(RecursiveDir)%(Filename)%(Extension)" ContinueOnError="false" />
</Target>
<Target Name="CleanThriftGen">
 <RemoveDir Directories="$(ErlangProjectSrcDir)" />
 <RemoveDir Directories="$(GenCSharpDir)" />
 <RemoveDir Directories="$(GenErlDir)" />
</Target>
<ItemGroup>
  <CSharpGenGroup Include="$(GenCSharpDir)**'*.*" />
</ItemGroup>

为什么我的MSBuild执行命令失败

发现我的大部分答案,在我匆忙中,我把可执行文件放在了我知道已经在我的路径中的第一个目录System32中。移动到另一个文件夹修复了当直接从VS (VS cmd/c)运行工具时的错误。

但我仍然不清楚是什么原因造成的。我不知道为什么cmd/c无法找到它,而具有正常权限的命令提示符可以找到它,我也不知道为什么VS找不到它。

作为一个测试,我给了新的文件夹,我把它放在权限中,需要管理权限来写,和System32一样,但是VS仍然能够从那里运行它。