针对PowerShell的x64与x86变异进行编程的最佳方式是什么?
我们有几个脚本用于安装和配置支持我们维护的系统的依赖项。 无论何时,我们都可以建立开发,测试,演示,培训,产品等环境。 我们经常发现,我们必须处理x64与x86架构,特别是关于PowerShell脚本的地方。
例如,我有一个使用Windows Installer PowerShell扩展来确定是否安装了程序/补丁的脚本。 如果没有显式调用PowerShell(x86),该脚本在x64环境中不起作用,默认情况下,该脚本不在路径中。 当我们将这些脚本移植到x64平台时,在这两种体系结构上维护一组可在powershell中运行的脚本并且仅在需要时才调用x86代码将非常好。
有没有人知道这样做的策略?
我用我的配置脚本碰到了这个问题。 我采取的基本方法是
不幸的是,这很多是以暴力方式完成的。 依赖于x86 / x64的每个特定配置条目实质上都有2个代码路径(每个架构一个)。
我能做的唯一真正的例外是测试磁盘上某些程序的存在。 我有一个方便的函数(Get-ProgramFiles32),可以很容易地测试程序。
if ( test-path (join-path Get-ProgramFiles32 "subversion") ) { ...
以下是我在公用库中处理32/64位差异的所有帮助函数。
# Get the path where powershell resides. If the caller passes -use32 then
# make sure we are returning back a 32 bit version of powershell regardless
# of the current machine architecture
function Get-PowerShellPath() {
param ( [switch]$use32=$false,
[string]$version="1.0" )
if ( $use32 -and (test-win64machine) ) {
return (join-path $env:windir "syswow64WindowsPowerShellv$versionpowershell.exe")
}
return (join-path $env:windir "System32WindowsPowerShellv$versionpowershell.exe")
}
# Is this a Win64 machine regardless of whether or not we are currently
# running in a 64 bit mode
function Test-Win64Machine() {
return test-path (join-path $env:WinDir "SysWow64")
}
# Is this a Wow64 powershell host
function Test-Wow64() {
return (Test-Win32) -and (test-path env:PROCESSOR_ARCHITEW6432)
}
# Is this a 64 bit process
function Test-Win64() {
return [IntPtr]::size -eq 8
}
# Is this a 32 bit process
function Test-Win32() {
return [IntPtr]::size -eq 4
}
function Get-ProgramFiles32() {
if (Test-Win64 ) {
return ${env:ProgramFiles(x86)}
}
return $env:ProgramFiles
}
function Invoke-Admin() {
param ( [string]$program = $(throw "Please specify a program" ),
[string]$argumentString = "",
[switch]$waitForExit )
$psi = new-object "Diagnostics.ProcessStartInfo"
$psi.FileName = $program
$psi.Arguments = $argumentString
$psi.Verb = "runas"
$proc = [Diagnostics.Process]::Start($psi)
if ( $waitForExit ) {
$proc.WaitForExit();
}
}
# Run the specified script as an administrator
function Invoke-ScriptAdmin() {
param ( [string]$scriptPath = $(throw "Please specify a script"),
[switch]$waitForExit,
[switch]$use32=$false )
$argString = ""
for ( $i = 0; $i -lt $args.Length; $i++ ) {
$argString += $args[$i]
if ( ($i + 1) -lt $args.Length ) {
$argString += " "
}
}
$p = "-Command & "
$p += resolve-path($scriptPath)
$p += " $argString"
$psPath = Get-PowershellPath -use32:$use32
write-debug ("Running: $psPath $p")
Invoke-Admin $psPath $p -waitForExit:$waitForExit
}
msgoodies博客有这个建议来确定架构。 可以使用这种方法来确定体系结构,并在存在已知的不兼容性时调用x86 powershell。
链接地址: http://www.djcxy.com/p/29097.html上一篇: What is the best way to program against powershell's x64 vs. x86 variability