Prebuild 事件在 Windows 7 中有效,在 XP 中失败
Posted
技术标签:
【中文标题】Prebuild 事件在 Windows 7 中有效,在 XP 中失败【英文标题】:Prebuild event works in Windows 7, fails in XP 【发布时间】:2011-09-19 21:09:27 【问题描述】:我设置了一个预构建事件来生成要嵌入到我的 exe 中的版本/内部版本号。该事件包括对执行实际工作的批处理文件的调用(将参数传递给批处理文件)。该批处理文件在我尝试过的所有计算机上都可以正常工作,包括 Windows XP 计算机。它在运行 Windows 7 的 3 台计算机上作为预构建事件也可以正常运行。但是,在 Windows XP 上,预构建事件失败。 Delphi 返回一个我似乎无法在任何地方找到引用的错误代码,“20018”。
我尝试了多种调用批处理文件的方式,但没有任何运气。有人知道发生了什么吗?
构建事件如下:
call "..\..\Build Tools\PreBuild.bat" "$(PROJECTDIR)"
更新: 我已经删除了批处理文件的来源,因为它与实际问题无关。
【问题讨论】:
Jason,如果没有比您提供的信息更多的信息,谁能告诉您可能有什么问题?我们不知道批处理文件包含什么、文件夹位置在哪里、有关您在 XP 下的权限(管理员、高级用户、受限用户)的任何信息,或者任何其他可能有帮助的信息。任何回答的尝试都只是猜测,这是没有用的。如果您需要帮助解决此问题,您需要提供更多信息 - 请记住,我们无法从此处看到您的屏幕,并且只有您在问题中提供的信息。 回答您的问题 Ken - 在预构建事件的上下文中识别错误代码 20018 的人可能会有一些见解。所以这就是有人可能告诉 OP 可能出了什么问题。对于任何不认识特定错误代码的人,是的,更多信息会有所帮助,但我不太确定,与原始问题在引发有用的信息方面相比,高压和居高临下的批评评论是否更有效在没有这些信息的情况下回答。我们应该尽量记住我们的 exp. (在 Delphi 或 SO 中)不是通用的。 @Jason - 正如肯以稍微不同的方式所说的那样,:),谷歌对该错误代码的点击量不足表明问题与批处理文件中的某些内容或环境中的某些内容完全不同。它正在运行。您是否尝试过在有问题的 XP 机器上单独运行批处理文件? (您的问题并不是 100% 清楚)。如果是这样(或者实际上,如果不是,那么这样做并且)会产生什么结果?您能否提供有关批处理文件包含的内容的更多详细信息?您可以分享的额外信息越多,别人就越有可能提供帮助。 向我们展示批处理文件以及您提供给它的参数。没有它,真的很难帮助你。 @Ken - 如果这是一个真正的要求,并且如果我拥有一辆表现出同样问题的现代汽车,那么我可以分享我的经验和结果,这反过来可能会对你有所帮助。事实上,我开的是马自达。但我不会因为您提供的信息而我的无法提供帮助。相反,我可能会问现代车主手册告诉你 3 次闪烁意味着什么,然后从那里开始。我继续感谢这里的一些人没有“帮助”我以及他们这些天在德尔福找到路时所形成的态度。 【参考方案1】:您提供的信息太少,以至于我很想投票结束。相反,我会大胆猜测。您应该在构建后步骤中发布命令。
如果您不知道哪条线路出现故障,请单独尝试第一条线路,然后删除其余线路,看看是否通过。
例如,我经常在 XP 机器上在后期构建步骤中使用 XCOPY 命令时遇到问题,这些命令通常会导致非常奇怪的错误代码,我无法诊断或确定其含义。因此,如果您有 XCOPY 命令,您应该在构建环境内部和外部尝试 XCOPY,例如,看看它是否适用于那个 Windows XP 机器。
您可以在运行命令时以宏扩展形式从 Rad Studio IDE 的“输出”选项卡中复制命令,将它们粘贴到记事本中,将它们作为批处理文件运行,然后尝试找出为什么它们不能在 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 之外运行它们并查看它们是否以这种方式工作,然后您可以尝试一些东西,就像我上面建议的那样。
如果this 是您的批处理文件...我建议由于依赖问题,您可能不想使用这种批处理文件技术来修改 RC 文件,因为它可能会在 MSBUILD 中暴露一些奇怪的依赖问题RAD/Delphi 构建任务。我还在 XP 上看到了一些奇怪的 BRCC32 故障,我无法重现。
【讨论】:
【参考方案2】:好的,我终于在这里找到了答案: http://delphi.about.com/od/devutilities/a/pre_post_build.htm
问题是正在调用的批处理文件的路径中有空格。显然这在 Windows 7 中不是问题。
删除构建工具目录中的空间并将预构建事件更改为以下修复了问题:
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
【讨论】:
以上是关于Prebuild 事件在 Windows 7 中有效,在 XP 中失败的主要内容,如果未能解决你的问题,请参考以下文章