ما هي أفضل طريقة للبرمجة ضد Powershell's x64 vs.تقلب x86

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

  •  03-07-2019
  •  | 
  •  

سؤال

لدينا العديد من البرامج النصية التي نستخدمها لتثبيت وتكوين التبعيات التي تدعم الأنظمة التي نحتفظ بها.نقوم بتشغيلها في أي وقت نقوم فيه بإنشاء تطوير، أو اختبار، أو عرض توضيحي، أو تدريب، أو إنتاج، وما إلى ذلك.بيئة.غالبًا ما نجد أنه يتعين علينا التعامل مع x64 مقابل x64.بنية x86، خاصة عندما يتعلق الأمر بالبرامج النصية بوويرشيل.

على سبيل المثال، لدي برنامج نصي يستخدم ملحقات Windows Installer PowerShell لتحديد ما إذا كان قد تم تثبيت برنامج/تصحيح.لا يعمل البرنامج النصي في بيئة x64 دون استدعاء PowerShell (x86) بشكل صريح، وهو غير موجود في المسار افتراضيًا.نظرًا لأننا ننقل هذه البرامج النصية إلى النظام الأساسي x64، سيكون من الرائع الحفاظ على مجموعة واحدة من البرامج النصية التي تعمل في Powershell على كلا البنيتين واستدعاء كود x86 فقط عند الحاجة.

هل يعرف أحد استراتيجية للقيام بذلك؟

هل كانت مفيدة؟

المحلول 2

msgoodies بلوق لها <لأ href = "http://msgoodies.blogspot.com/2008 /05/is-this-powershell-session-32-bit-or-64.html "يختلط =" نوفولو noreferrer "> هذا الاقتراح لتحديد العمارة . يمكن للمرء أن استخدام هذا النهج لتحديد الهندسة المعمارية واستدعاء بوويرشيل إلى 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 بشكل أساسي على مسارين للتعليمات البرمجية (واحد لكل بنية).

الاستثناء الحقيقي الوحيد الذي تمكنت من القيام به هو اختبار وجود برامج معينة على القرص.لدي وظيفة مفيدة (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