我正在尝试在预构建事件期间执行批处理文件。我有一个新项目,并添加了 foo.bat 。该文件包含以下行:
echo bar
当我将预构建事件命令行设置为 foo.bat 时,出现以下错误:
命令“foo.bat”退出,代码为9009。
当我将预构建事件命令行设置为调用foo.bat 时,出现以下错误:
命令“call foo.bat”退出,代码为1。
我读过的与这些代码相关的所有内容通常表示批处理文件的内容存在问题(在这种情况下不太可能)或系统无法找到批处理文件。
批处理文件在命令提示符下正常工作。我已经尝试过的事情:使用不同的工具,各种编码创建文件,在文件中放置出口0,为文件创建不同的构建操作,以及将文件复制到输出目录。一切都没有运气。
我错过了什么?它必须简单。
更新:是的,很简单 - 路径的长度太长了。有关详细信息,请参阅下面的答案。
谢谢!
答案 0 :(得分:11)
答案 1 :(得分:4)
您可能在foo.bat
的某个地方有另一个PATH
。尝试指定批处理文件的完整路径,例如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
答案 2 :(得分:3)
看起来我的问题是批处理文件路径的长度。由于这是一个概念证明,我让VS在默认位置创建它:
C:\ Documents and 设置\ UserXXX \我的 Documents \ Visual Studio 2010 \项目\ SolutionXXX \ ProjectXXX \ foo.bat
只要我将解决方案移动到路径较短的位置,它就能正常工作。 = P
感谢您的建议!
答案 3 :(得分:1)
1)通过View =>查看错误详情产量 2)尝试调用“$(SolutionDir)\ xx \ xx.bat”
答案 4 :(得分:1)
我通过从Windows资源管理器创建.bat文件解决了这个问题,然后将其包含在我的项目中,而不是直接在VS 2010中创建。
答案 5 :(得分:1)
预构建和后构建事件的当前工作目录是宏$(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>
答案 6 :(得分:0)
我怀疑的问题是你的文件夹路径中有一个SPACE字符。
因此,此命令可能适用于c:\development\projectABC\foo.bat
,但不适用于c:\development\project ABC\foo.bat
至少对我来说这是个问题,可能还有其他问题,但我怀疑这是最常见的问题。解决方案:在批量调用周围加上引号:
"c:\development\project ABC\foo.bat"
答案 7 :(得分:-2)
右键单击该项目 - &gt;选择属性 - &gt; select build event Tab然后清除Pre-Build事件注释行。