【问题标题】:Problem Executing Batch File in Pre-Build Event在预构建事件中执行批处理文件的问题
【发布时间】:2011-01-17 15:39:33
【问题描述】:

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

echo bar

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

“foo.bat”命令退出,代码为 9009。

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

命令“call foo.bat”以代码 1 退出。

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

批处理文件在命令提示符下工作正常。我已经尝试过的事情:使用不同的工具、各种编码创建文件、将出口 0 放置在文件中、文件的不同构建操作以及将文件复制到输出目录。一切都没有运气。

我错过了什么?它必须是简单的。

更新:是的,很简单——路径的长度太长了。有关详细信息,请参阅下面的答案。

谢谢!

【问题讨论】:

  • 您是否尝试过让每个人都可以阅读/写作?

标签: c# visual-studio-2010


【解决方案1】:

我得到了这个工作,我认为一张图片值一千字,所以这是一个屏幕截图中的完整设置。

【讨论】:

  • 到批处理文件目录的 CD 是在这里为我修复它的原因...当我直接调用 'c:\mydirectory\mybatch.bat' 它不起作用,但是 cd 到 ' c:\mydirectory' 然后调用 'mybatch.bat' 确实有效...谢谢!
【解决方案2】:

您可能在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

【讨论】:

  • 起初我尝试了$(SolutionDir)Scripts\PostBuild.bat,但后来出现错误代码9009。当我使用cmd $(SolutionDir)Scripts\PostBuild.bat时,它对我有用,谢谢!我的 bat 文件测试包含一行 exit 0 没有其他空格。
  • 对不起,这实际上不起作用,我已经在下面发布了答案,cmd 只是没有显示错误......但它也没有运行批处理文件跨度>
【解决方案3】:

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

C:\文档和 设置\用户XXX\我的 文档\Visual Studio 2010\Projects\SolutionXXX\ProjectXXX\foo.bat

只要我将解决方案移到路径较短的位置,它就可以正常工作。 =P

感谢您的建议!

【讨论】:

  • 这似乎并不长,但确实包含空格。也许约翰把它移到了一个没有空格的地方,这就是修复它的原因。如果将路径放在双引号中,则可以使用带空格的路径。
【解决方案4】:

pre-build 和 post-build 事件的当前工作目录是宏 $(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>

【讨论】:

    【解决方案5】:

    1) 查看错误详情 => 输出 2) 尝试调用"$(SolutionDir)\xx\xx.bat"

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        我怀疑的问题是您的文件夹路径中有空格字符。

        所以这个命令可能适用于c:\development\projectABC\foo.bat,但不适用于c:\development\project ABC\foo.bat

        至少这对我来说是个问题,可能还有其他问题,但我怀疑这是最常见的。解决方案:在你的批量调用周围加上引号:

        "c:\development\project ABC\foo.bat"
        

        【讨论】:

          【解决方案8】:

          右击项目 --> 选择属性 --> 选择构建事件 Tab 然后清除 Pre-Build 事件注释行。

          【讨论】:

          • 这并没有修复专门尝试执行批处理的问题,是吗?它只是消除了原因。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 2017-01-17
          • 1970-01-01
          • 2017-04-05
          • 1970-01-01
          相关资源
          最近更新 更多