在预构建事件中执行批处理文件出现问题

13

我正在尝试在预构建事件期间执行批处理文件。我有一个新项目,并添加了foo.bat文件。该文件包含以下行:

echo bar

当我将预构建事件命令行设置为foo.bat时,我会收到以下错误:

命令“foo.bat”退出并带有代码9009。

当我将预构建事件命令行设置为call foo.bat时,我会收到以下错误:

命令“call foo.bat”退出并带有代码1。

我读过的与这些代码相关的所有内容通常都指出批处理文件的内容存在问题(在这种情况下不太可能),或者系统无法找到批处理文件。

从命令提示符中运行该批处理文件没有问题。我已尝试的事项:使用不同的工具创建文件、使用各种编码、在文件中放置exit 0、为文件使用不同的构建操作,并将文件复制到输出目录。所有这些都没有成功。

我错过了什么?一定是某个简单的东西。

更新: 是的,很简单——路径太长了。请参见下面的答案获取详细信息。

谢谢!


你尝试过给每个人读写权限吗? - the_drow
8个回答

12

我已经解决了这个问题,我认为图片胜过千言万语,所以这里是一个单一的屏幕截图,展示了完整的设置。

图片描述


将 CD 到批处理文件目录是解决我的问题的方法...当我直接调用 'c:\mydirectory\mybatch.bat' 时,它不起作用,但是先 CD 到 'c:\mydirectory' 然后再调用 'mybatch.bat' 就可以了...谢谢! - Robert Petz

6

可能你在 PATH 中的其他地方有另一个 foo.bat 文件。尝试指定批处理文件的完整路径,例如 C:\Path\to\foo.bat

当项目正在构建时,当前目录是具有 .vcproj 文件的目录。如果不在 PATH 中,则应相对于此目录指定命令路径。

诊断问题的另一种方法是明确在预建事件命令中指定 cmd,如下所示:

cmd /c C:\Path\to\foo.bat

甚至更多。
C:\windows\system32\cmd.exe /c C:\Path\to\foo.bat

1
起初,我尝试使用$(SolutionDir)Scripts\PostBuild.bat,但后来出现了错误代码9009。当我改用cmd $(SolutionDir)Scripts\PostBuild.bat时,它就可以正常工作了,非常感谢!我的bat文件测试仅包含一行exit 0,没有其他空格。 - HodlDwon
抱歉,这实际上没有起作用,我已经在下面发布了一个答案,cmd 没有显示错误……但它也没有运行批处理文件。 - HodlDwon

3
看起来我的问题是批处理文件路径太长了。由于这只是一个概念验证,我让 VS 在默认位置创建它:

C:\Documents and Settings\UserXXX\My Documents\Visual Studio 2010\Projects\SolutionXXX\ProjectXXX\foo.bat

一旦我把解决方案移到了一个路径更短的位置,它就正常工作了。=P
感谢您的建议!

这段内容似乎不是很长,但其中包含了空格。也许约翰将其移动到没有空格的位置,这就解决了问题。如果你将路径放在双引号中,就可以使用带有空格的路径。 - Tommy Herbert

2

预构建事件和后构建事件的当前工作目录是由宏$(OutDir)指定的输出目录,而不是项目目录。

以下标签在"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets"中指定了这一点:

<Target
    Name="PreBuildEvent"
    Condition="'$(PreBuildEvent)'!=''"
    DependsOnTargets="$(PreBuildEventDependsOn)">

    <Exec WorkingDirectory="$(OutDir)" Command="$(PreBuildEvent)" />
</Target>

<Target
    Name="PostBuildEvent"
    Condition="'$(PostBuildEvent)' != '' and ('$(RunPostBuildEvent)' != 'OnOutputUpdated' or '$(_AssemblyTimestampBeforeCompile)' != '$(_AssemblyTimestampAfterCompile)')"
    DependsOnTargets="$(PostBuildEventDependsOn)">

    <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" />
</Target>

1

我通过在Windows资源管理器中创建.bat文件,然后将其包含到我的项目中来解决了这个问题,而不是直接在VS 2010中创建它。


1

1) 通过查看“视图”=>“输出”来查看错误详细信息 2) 尝试调用“$(SolutionDir)\xx\xx.bat”


0
我怀疑的问题是您的文件夹路径中有一个空格字符。
因此,这个命令可能适用于c:\development\projectABC\foo.bat,但不适用于c:\development\project ABC\foo.bat。
至少对我来说是这个问题,可能还有其他问题,但我认为这是最常见的问题。解决方案:在批处理调用周围加上引号。
"c:\development\project ABC\foo.bat"

-3

右键点击项目 --> 选择属性 --> 选择构建事件选项卡,然后清除预构建事件的注释行。


2
这并没有“修复”尝试特定执行批处理的问题,对吧?它只是消除了原因。 - Hexo

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