在 MSBuild 中找出当前操作系统的“位”度

发布于 2024-09-15 11:05:24 字数 624 浏览 16 评论 0原文

我有一个构建脚本,需要对可执行文件的路径进行硬编码。路径是:

  • C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\cabwiz.exe

这工作正常,但现在我在 64 位操作系统上运行(但我的同事和构建服务器在 32 位上)仍然)。

我需要的路径是这样的:

  • C:\Program Files (x86)\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\cabwiz.exe

但请使用其他路径的正常路径。

我是这样设置的:

<PropertyGroup>
    <CabWiz>"C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\cabwiz.exe"</CabWiz>
</PropertyGroup>

是否有一个条件可以设置,以便在操作系统(不是当前构建配置)是 64 位时我可以设置它?

I have a build script that needs to hard code a path to an executable. The path is:

  • C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\cabwiz.exe

This has worked fine, but now I am running on a 64 bit OS (but my coworker and build server are on 32 bit still).

I need the path to be this for me:

  • C:\Program Files (x86)\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\cabwiz.exe

But use the normal path for the others.

Here is how I set it up:

<PropertyGroup>
    <CabWiz>"C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\cabwiz.exe"</CabWiz>
</PropertyGroup>

Is there a condition I can put on that so that I can set it if the OS (not the current build configuration) is 64 bit?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

来世叙缘 2024-09-22 11:05:24

有一个注册表项可以告诉您当前操作系统的位数。以下是我在 MSBuild 文件中使用的属性:

<PropertyGroup>
        <MachineProcessorArchitecture>$(registry:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment@PROCESSOR_ARCHITECTURE)</MachineProcessorArchitecture>
        <Is32Bit>False</Is32Bit>
        <Is32Bit Condition="'$(MachineProcessorArchitecture)' == 'x86'">True</Is32Bit>
        <Is64Bit>False</Is64Bit>
        <Is64Bit Condition="'$(MachineProcessorArchitecture)' == 'AMD64'">True</Is64Bit>
</PropertyGroup>

There is a registry key that will tell you the bit-edness of the current OS. Here are the properties I use in my MSBuild files:

<PropertyGroup>
        <MachineProcessorArchitecture>$(registry:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment@PROCESSOR_ARCHITECTURE)</MachineProcessorArchitecture>
        <Is32Bit>False</Is32Bit>
        <Is32Bit Condition="'$(MachineProcessorArchitecture)' == 'x86'">True</Is32Bit>
        <Is64Bit>False</Is64Bit>
        <Is64Bit Condition="'$(MachineProcessorArchitecture)' == 'AMD64'">True</Is64Bit>
</PropertyGroup>
天冷不及心凉 2024-09-22 11:05:24

您正在使用位数来尝试猜测正确的 Program Files 文件夹,但不能保证它位于 C 驱动器上,甚至不能保证称为“Program Files”。您最好使用 $(MSBuildProgramFiles32) 属性(在 MSBuild 4.0 中)。

You're using the bitness to try and guess the correct Program Files folder, but there's no guarantee that it's on the C drive, or even called "Program Files". You would be better using the $(MSBuildProgramFiles32) property (in MSBuild 4.0).

没有伤那来痛 2024-09-22 11:05:24

在 64 位操作系统上,定义了以下变量:

ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)

因此只需测试 ProgramFiles(x86),如果它为空,则使用 ProgramFiles

On a 64-bit OS, the following variables are defined:

ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)

So just test for ProgramFiles(x86) and if it's empty, use ProgramFiles.

記柔刀 2024-09-22 11:05:24

如果您始终运行 32 位版本的 MSBuild,无论平台如何,那么这很简单:只需将“C:\Program Files”替换为“$(ProgramFiles)”即可。无论是在 32 位还是 64 位操作系统上,“$(ProgramFiles)”都应扩展到正确的文件夹位置(所有 32 位程序的位置)。

如果您在 64 位平台上运行 64 位版本的 MSBuild(这不太可能),那么事情会变得有点棘手。 '%ProgramFiles(x86)%' 环境变量似乎是您想要的,但祝您处理这些括号好运。更简单的方法可能是在条件中使用“%PROCESSOR_ARCHITECTURE%”环境变量。

If you're always running the 32-bit version of MSBuild, regardless of the platform, then it's easy: just substitute '$(ProgramFiles)' for 'C:\Program Files'. Whether on a 32-bit or 64-bit OS, '$(ProgramFiles)' should expand to the correct folder location (the location of all 32-bit programs).

If you're running the 64-bit version of MSBuild on 64-bit platforms (which is unlikely), then it gets a bit trickier. The '%ProgramFiles(x86)%' environment variable would seem to be what you want, but good luck dealing with those parentheses. Easier would probably be to use the '%PROCESSOR_ARCHITECTURE%' environment variable in a condition.

狼亦尘 2024-09-22 11:05:24

我们使用的解决方案依赖于MSBuild的最新功能;可以调用

[System.Environment]::Is64BitOperatingSystem

来了解操作系统的位数:

  • 对于 32 位操作系统 Condition="'$([System.Environment]::Is64BitOperatingSystem)' == 'False'"
  • Condition="'$([System.Environment]::Is64BitOperatingSystem)' == 'True'" 适用于 64 位操作系统

在 Windows 上测试,它也可以在 Linux 上运行。
此处 完整的项目。

The solution we used relies on latest features of MSBuild; it is possible to invoke

[System.Environment]::Is64BitOperatingSystem

to understand the bitness of the Operating System:

  • Condition="'$([System.Environment]::Is64BitOperatingSystem)' == 'False'" for 32 bit OSes
  • Condition="'$([System.Environment]::Is64BitOperatingSystem)' == 'True'" for 64 bit OSes

Tested on Windows, it can works on Linux too.
Here the full project.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文