Prebuild事件在Windows 7中有效,在XP中失败

| 我设置了一个预构建事件,以生成要嵌入到我的exe中的版本/内部版本号。该事件包括对执行实际工作的批处理文件的调用(将参数传递给该批处理文件)。批处理文件在我尝试过的所有计算机(包括Windows XP计算机)上都可以正常工作。在运行Windows 7的3台计算机上,它也可以作为预构建事件很好地运行。但是,预构建事件在Windows XP上失败。 Delphi返回了一个错误代码,我似乎找不到对任何地方“ 20018”的引用。 我已经尝试了多种方式来调用批处理文件,但没有任何运气。有人知道发生了什么吗? 构建事件如下:
call \"..\\..\\Build Tools\\PreBuild.bat\" \"$(PROJECTDIR)\"
更新: 我已删除了批处理文件的源代码,因为它与实际问题无关。     
已邀请:
        您提供的信息很少,我很想投票关闭。相反,我会大胆猜测。您应该在构建后步骤中发布命令。 如果您不知道哪条线发生故障,请尝试第一个,然后删除其余的,看看是否通过。 例如,在XP机器上,在构建后的步骤中使用XCOPY命令时,我经常遇到问题,这些命令经常会导致我无法诊断或确定其含义的错误代码。因此,如果您具有XCOPY命令,则应在构建环境的内部和外部尝试XCOPY,例如,查看它是否在该Windows XP机器上有效。 您可以在运行时从Rad Studio IDE的\“ Output \”选项卡中以展开的宏格式复制命令,将它们粘贴到记事本中,将它们作为批处理文件运行,并尝试找出原因它们在Windows XP上不起作用。 这是使用XCOPY的变通方法示例。如果此操作在XP上失败,我将对其进行调整,直到它起作用:
 XCOPY  SourceDir DestDir
我不得不以这种方式修复它:
 XCOPY.exe  SourceDir DestDir
在另一种情况下,我发现必须以这种方式修复它:
 call XCOPY SourceDir DestDir
您还提到您只是在运行一个神秘的批处理文件,而没有提及它的作用。因此,让我们来看一下,从构建后的步骤运行批处理文件时,我们可以做些什么。...当我运行这样的批处理文件时,有时在XP上会遇到问题,如下所示:
batchfilename.cmd
但是当我以不同的方式运行它时,我发现它可以在XP上运行,但是我丢失了命令行输出:
call batchfilename.cmd
在IDE中运行构建后步骤时,似乎发生了一些奇怪的事情,可以通过尝试以各种形式在IDE外部尝试命令来解决。 您提到的数字(20018)有点愚蠢,它可能是您在批处理文件中运行的任何工具的ERRORLEVEL(向命令外壳返回值)。由于您没有告诉我们您正在运行什么工具,所以我想知道您是否已经完成了查看在XP计算机上IDE之外运行该批处理文件时会发生什么的基本步骤。我的猜测是,如果它不是来自您自己的批处理文件,则它来自MSBUILD本身的内心深处,这是几乎没有任何Delphi人员会知道源代码的东西(即使Delphi团队本身也是使用Microsoft提供的二进制文件提供MSBUild功能)。我注意到,MSBUILD的用于执行构建后和构建前步骤的内置任务是IDE的一个需要改进的领域,尤其是在调试此类问题时。但是,您可以简单地在IDE外部运行它们,看看它们是否能以这种方式工作,并且您可以尝试一些东西,如我上面所建议的。 如果这是您的批处理文件...我建议由于依赖性问题,您可能不想使用这种批处理文件技术来修改RC文件,因为它可能会在RAD / Delphi构建任务的MSBUILD中暴露出一些奇怪的依赖性问题。 。在XP上,我也曾见过一些怪异的BRCC32故障,但我无法重现。     
好的,我终于在这里找到了答案: http://delphi.about.com/od/devutilities/a/pre_post_build.htm 问题是被调用的批处理文件的路径中有空格。显然,这在Windows 7中不是问题。 删除构建工具目录中的空间,并将pre build事件更改为以下内容可解决此问题:
call ..\\..\\BuildTools\\PreBuild.bat \"$(PROJECTDIR)\"
这是链接中的重要内容:   命令行:这是所有操作中最棘手的,但是当您开始工作后,它们都很容易。这里的技巧不是在程序名称上使用引号,而是在Windows SFN(短文件名)中使用。原因是,如果需要使用引号将文件的路径括起来,则IDE会与过多的引号混淆。因此,这些是在上面添加该命令行的错误方法:      C:\\ Program Files \\ SoftwarePassport \\ Armadillo.exe D:\\ Dev \\ My Prog \\ Prot.arm / P      \“ C:\\ Program Files \\ SoftwarePassport \\ Armadillo.exe \” D:\\ Dev \\ My Prog \\ Prot.arm / P      C:\\ Program Files \\ SoftwarePassport \\ Armadillo.exe \“ D:\\ Dev \\ My Prog \\ Prot.arm \” / P      \“ C:\\ Program Files \\ SoftwarePassport \\ Armadillo.exe \” \“ D:\\ Dev \\ My Prog \\ Prot.arm \” / P      如果没有让IDE与它混淆,那么最后一个应该可以工作。因此,有效的方法之一是:   C:\\ Progra〜1 \\ Softwa〜1 \\ Armadillo.exe \“ D:\\ Dev \\ My Prog \\ Prot.arm \” / P      C:\\ Progra〜1 \\ SoftwarePassport \\ Armadillo.exe \“ D:\\ Dev \\ My Prog \\ Prot.arm \” / P     

要回复问题请先登录注册