Каков наилучший способ программирования на основе x64 от powershell?изменчивость x86

StackOverflow https://stackoverflow.com/questions/602060

  •  03-07-2019
  •  | 
  •  

Вопрос

У нас есть несколько сценариев, которые мы используем для установки и настройки зависимостей, поддерживающих системы, которые мы поддерживаем.Мы запускаем их всякий раз, когда разрабатываем, тестируем, демо, обучаем, продаем и т.д.Окружающая среда.Мы часто обнаруживаем, что нам приходится иметь дело с x64 vs.архитектура x86, особенно там, где речь идет о сценариях powershell.

Например, у меня есть скрипт, который использует Расширения PowerShell Установщика Windows чтобы определить, была ли установлена программа / исправление.Скрипт не работает в среде x64 без явного вызова PowerShell (x86), которого по умолчанию нет в path.Поскольку мы переносим эти скрипты на платформу x64, было бы здорово поддерживать единый набор скриптов, которые работают в powershell на обеих архитектурах и вызывают код x86 только при необходимости.

Кто-нибудь знает о стратегии для этого?

Это было полезно?

Решение 2

Тот Самый блог msgoodies имеет это предложение для определения архитектуры.Можно было бы использовать этот подход для определения архитектуры и вызова x86 powershell при наличии известной несовместимости.

Другие советы

Я часто сталкиваюсь с этой проблемой в своих скриптах настройки.Основной подход, который я использую, заключается в том, чтобы

  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 пути к коду (по одному для каждой архитектуры).

Единственное реальное исключение, которое я смог сделать, - это проверить наличие определенных программ на диске.У меня есть удобная функция (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 "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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top