从 MSBuild 在 x64 中执行 powershell

问题描述 投票:0回答:1

我想使用 Powershell 运行构建后脚本。该脚本需要在 64 位下运行。但是,每当我使用 .csproj 文件运行 msbuild 时,脚本始终以 32 位运行。如果我从启动 msbuild 的同一个 powershell 会话运行相同的脚本,则该脚本可以在 x64 中正常运行。

我的命令:

msbuild .\src\Project.csproj /t:Build /p:Platform='x64' /p:Configuration='Debug'

我想我可以强制使用64位版本,就像这个post所建议的那样 我的 .csproj 文件中的目标:

<PropertyGroup> 
     <PowerShellExe>$(WINDIR)\system32\WindowsPowerShell\v1.0\powershell.exe</PowerShellExe>
</PropertyGroup>
<Target Name="AfterBuild">
   <Exec Command="$(PowerShellExe) .\Run-AfterBuild.ps1" WorkingDirectory="$(OutputPath)"/>
</Target>

构建后脚本的开头:

Write-Host $"Is a 64bitsProcess $([System.Environment]::Is64BitProcess)"

从 msbuild 运行时,输出为 false,而从启动 msbuild 但运行脚本的会话中直接输出 true。

MS 构建版本:16.3

powershell msbuild csproj
1个回答
3
投票

64 位与 32 位进程 请参阅 单独的、特定于位的目录,如

C:\Windows\System32

因此,当从 32 位进程启动时,

$(WINDIR)\System32\WindowsPowerShell\v1.0\powershell.exe
指的是 32 位版本的 PowerShell。

但是,有一个虚拟[1]

SysNative
目录,它允许32位进程访问64位System32目录[2]

$(WINDIR)\SysNative\WindowsPowerShell\v1.0\powershell.exe

为了完整起见:对于,即允许64位进程访问32位System32目录,请使用(非虚拟)

SysWOW64
目录


[1] 当枚举

C:\Windows\System32
的子目录时,会显示no
SysNative
条目。但是,使用它作为路径的一部分,例如
C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe
,透明地针对 32 位进程不可见的 64 位 System32 目录。

[2] 请注意,此虚拟目录仅对 32 位 进程可见。从 PowerShell 会话内部,引用 64 位 SYSTEM32 目录的与位无关的方法是: "$env:windir\" + ('SysNative', 'System32')[[Environment]::Is64BitProcess]

    

© www.soinside.com 2019 - 2024. All rights reserved.