gpt4 book ai didi

powershell - 针对 powershell 的 x64 与 x86 可变性进行编程的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-03 06:57:34 25 4
gpt4 key购买 nike

我们有几个脚本用于安装和配置支持我们维护的系统的依赖项。我们在建立开发、测试、演示、训练、生产等环境时运行这些。我们经常发现我们必须处理 x64 与 x86 架构,尤其是涉及 powershell 脚本的情况。

例如,我有一个使用 Windows Installer PowerShell Extensions 的脚本确定是否已安装程序/补丁。如果不显式调用 PowerShell (x86),该脚本将无法在 x64 环境中运行,默认情况下 PowerShell 不在路径中。当我们将这些脚本移植到 x64 平台时,如果能够维护一组可以在两种架构上的 powershell 中工作并且仅在需要时调用 x86 代码的脚本,那就太好了。

有人知道这样做的策略吗?

最佳答案

我在配置脚本中经常遇到这个问题。我采取的基本方法是

  1. 使用多个函数来测试我是否处于 64 位环境 ( http://blogs.msdn.com/jaredpar/archive/2008/10/16/powershell-and-64-bit-windows-helper-functions.aspx )
  2. 根据特定脚本的需要调用 x86/x64 PowerShell

不幸的是,其中很多都是通过暴力方式完成的。每个依赖于 x86/x64 的特定配置条目本质上都有 2 个代码路径(每个体系结构一个)。

我能够做的唯一真正的异常(exception)是测试磁盘上某些程序是否存在。我有一个方便的函数(Get-ProgramFiles32),可以轻松测试程序。

if ( test-path (join-path Get-ProgramFiles32 "subversion") ) { ...

以下是我的公共(public)库中处理 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 "syswow64\WindowsPowerShell\v$version\powershell.exe")
}

return (join-path $env:windir "System32\WindowsPowerShell\v$version\powershell.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
}

关于powershell - 针对 powershell 的 x64 与 x86 可变性进行编程的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/602060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com