如何解决错误:"命令[...]以1的代码退出"?

76

我已经阅读了很多问题,但是我没有找到适合我的正确答案。

当我尝试在VS2012中编译一个项目时,我得到了这个结果:

命令“....\tools\bin\nuget pack Packages\Lib.Html.nuspec -OutputDirectory ....\bin\Zip\Packages -NoPackageAnalysis”退出代码1。

我查找了我的.csproj文件中的代码行,应该是错误的位置,而且它确实存在:

<Exec Command="$(ProjectDir)..\..\tools\bin\nuget pack $(ProjectDir)Packages\Lib.Html.nuspec -OutputDirectory $(OutputPath)Packages -NoPackageAnalysis" />  

我做错了什么?

[编辑] 启动该项目的调试并忽略“构建错误”,我收到了一个新的警告:

"Visual Studio 无法启动调试,因为调试目标 '[project.exe 路径]' 丢失。 请构建该项目并重试,或者适当设置 OutputPath 和 AssemblyName 属性以指向目标程序集的正确位置。"


1
当你说“result”时,你是指“错误列表”视图吗?试着看一下“输出”视图,可能会有额外的信息。 - Tewr
是的,我指的是错误列表。不幸的是,那个项目只是一个类库,但如果我开始调试并忽略“构建错误”,VS会弹出警报,我会编辑我的问题。希望它能有所帮助 :) - xnr_z
1
请再次查看“输出”视图,看看这个窗口中是否有附加信息?可以在菜单“视图”->“输出”中找到输出视图。 - Tewr
1
检查文件"$(ProjectDir)....\tools\bin\nuget pack $(ProjectDir)Packages\Lib.Html.nuspec"是否存在。 - Lukas Kubis
14个回答

150

第一步是找出实际的错误。为此,请将您的MsBuild输出扩展到诊断级别。这将显示实际执行的命令,以及希望能显示完整的错误信息。

  • 工具 -> 选项
  • 项目和解决方案 -> 构建和运行
  • 将“MsBuild项目构建输出详细程度”更改为“诊断”。

14
事实证明,我在路径周围没有加引号,所以当我在路径中添加了一个空格时,程序退出并返回1。这种方法帮助我发现了这个问题。 - Shelby115
5
好的建议!您,先生,得到了我的点赞 :D 然而,“诊断”选项提供的数据太多了。将其设置为“正常”选项使我得到了需要的信息,并且仍然易于管理 :) 结果发现我使用了错误的PowerShell“执行策略”。通过在PowerShell中运行“Set-ExecutionPolicy UnRestricted -Scope CurrentUser”进行修正。 - jk1990
谢谢!你的评论很有帮助。在构建事件中引用的一个项目处于锁定状态。在项目文件夹上执行svncleanup解决了我的问题。 - josepainumkal
谢谢!对于我的情况来说,这只是一个简单的语法错误(缺少空格)。知道这个技巧非常有用。Verbose 提供了大量信息,所以我将我的设置为详细模式,这已经足够找出问题所在了。 - RandallTo
2
我将git克隆到我的F:/驱动器中,就没有出现问题了。也许问题是因为我将git克隆到一个项目文件夹中,该文件夹的名称中有空格。教训:不要在文件夹/文件名中使用空格。 - Thuy
谢谢Jared。我只是想让你知道,你救了我的一天 :-) 我从合作伙伴公司得到了一个项目,但我无法弄清楚为什么我无法构建该项目。事实证明,我不能在项目文件夹的名称中使用空格。 - GameDevAlien

36

右键项目->属性->生成事件

删除“后生成事件命令行”文本块中的文本。


谢谢!项目中有一些在预构建事件中的命令失败了,删除它们后问题得到解决。 - Shishir Gupta
2
我建议在不了解预/后构建命令的作用和失败原因的情况下不要删除它们。有时候你可能会错过在运行它们的项目上完成的重要设置。 - meJustAndrew

7

对于我来说:我的文件夹路径名中有空格 G:\Other Imp Projects\Mi.....

解决方案1:

移除文件夹中的空格

例如:Other Imp Projects ->> Other_Imp_Projects

解决方案2:

在您的路径中添加引号 ("")。

例如:mkdir "$(ProjectDir)$(OutDir)Configurations" //注意双引号


7

尝试以管理员身份打开Visual Studio。


当我尝试将PowerShell脚本作为后置构建事件运行时,这对我来说是答案。 - D.B. Fred
这对我也起作用了。不需要更改任何VS设置。 - wickjon

2

我在使用VS 2013时,需要在UI项目(MVC)的“References”中删除缺失引用。结果发现,缺失的引用并未被引用。


1
我知道现在已经太晚了,但是这也可能对其他人有帮助。
在我的情况下,我发现源文件正在被另一个进程使用,这导致无法将其复制到目标位置。通过使用命令提示符(只需将后构建命令复制粘贴到命令提示符中并执行即可获得错误信息),我发现了这个问题。
请确保您可以从命令提示符中复制。

1
这是基于JaredPar的答案,适用于VS2017。在Visual Studio 2017中,相同的“构建和运行”选项存在。
我收到了“chmod +x"""命令退出代码1的消息。
在构建输出窗口中,我搜索了“错误”,并在同一区域找到了一些错误。我能够点击构建输出中的链接,并发现错误涉及.targets文件中的此条目:
  <Target Name="ChmodChromeDriver" BeforeTargets="BeforeBuild" Condition="'$(WebDriverPlatform)' != 'win32'">
    <Exec Command="chmod +x &quot;$(ChromeDriverSrcPath)&quot;" />
  </Target>

在构建输出中,我还发现了一个更详细的错误消息,基本上说明它在查找的包文件夹中找不到Selenium.WebDriver.ChromeDriver v2.36。我检查了项目的NuGet包,版本2.36确实在已安装的包列表中。我找到了2.36的包文件,并将文件夹、子文件夹和文件的属性从“只读”改为“读/写”。进行了构建,但仍然失败。有时“更新”到不同版本的包,然后再更新回原始版本可以修复此类错误。所以我在Manage NuGet packages中“更新”了引用到2.37,构建失败,然后“更新”回2.36,构建成功,没有出现“chmod +x”错误消息。
我正在构建的项目是基于Visual Studio项目模板开发的Appium测试工具,模板名称为“Develop_Automated_Test”。

1

检查路径:如果您为TFS(很可能)使用单独的构建服务器,请确保.csproj文件中的所有路径 TFS服务器路径匹配。当我将*.csproj文件签入时,由于其引用了我的开发机器路径而不是TFS服务器路径,因此出现了上述错误。

删除多行命令:此外,请尝试将xml中的多行命令转换为单行命令以作为一种预防措施。我在*.proj中有以下xml导致在TFS中出现问题:

<Exec Condition="bl.." 
Command=" Blah...
..." </Exec>

将上面的 XML 更改为下面的内容可以解决问题:
  <Exec Condition="bl.." Command=" Blah..." </Exec>

1

提示:在您的项目中搜索“Exec Command =”

在我的情况下,我在“Microsoft.Extensions.ApiDescription.Server.targets”文件中找到了以下标记,我注释掉了该行,这对我起作用了:

<Exec Command="$(_Command)" LogStandardErrorAsError="true" />

这帮助我诊断了问题。将<Exec Command="powershell Script.ps1" />更改为<Exec Command="powershell ./Script.ps1" />解决了我的问题。 - bounav

0

我的批处理文件中没有语法错误,在 VS 之外的命令提示符下运行良好。因此,最终我添加了

exit 0

在我的批处理文件末尾明确返回成功代码,然后它开始正常工作了。

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