1

Я хочу, чтобы мой самораспаковывающийся архив из 7 zip запускал скрипт PowerShell после извлечения файлов. Для этого я использую метод, описанный здесь: http://www.sphaero.org/blog:2011:0504_7zip_self_extracting_autostart_exe

После извлечения файла я хочу запустить скрипт powershell, поэтому вот мое содержимое файла config.txt:

;!@Install@!UTF-8!
RunProgram="InstallCU.bat"
;!@InstallEnd@!

Файл InstallCU.bat запускает PowerShell:

powershell.exe -ExecutionPolicy Unrestricted -File InstallCU.ps1

Внутри сценария powershell я делаю много вещей, включая проверку некоторых разделов реестра в этой ветке:

HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components

использование команд Test-Path и Get-ItemProperty

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

Моя проблема заключается в том, что в 64-разрядных системах запускается 32-разрядная (x86) версия PowerShell. Когда я обращаюсь к любому пути в реестре в разделе HKLM:\Software, он перенаправляется в HKLM:\Software\Wow6432Node\ и, конечно, не может найти нужную мне информацию (потому что она находится в 64-битной ветви реестра )

Вопрос:

1) Как мне сделать 64-битный 7-zip SFX?

ИЛИ ЖЕ

2) Как мне запустить 64-битную PowerShell из 32-битного SFX?

ИЛИ ЖЕ

3) Как мне прочитать 64-битный реестр (не Wow6432Node) через 32-битный powershell? (Хотя я думаю, что это либо невозможно, либо значительно увеличит объем кода PowerShell)

ИЛИ ЖЕ

Любые другие предложения?

2 ответа2

0

Вот вложенная функция Archetype для определения разрядности ОС + разрядности Powershell. Добавлен sysnative путь в переменной к reg.exe, чтобы вы могли редактировать ключи x64 из 32-битного процесса. Если вы не предпочитаете reg.exe, я уверен, что есть другие способы сделать то же самое.

    Function ARCHETYPE (){

    $ARCH = (Get-WmiObject -class Win32_OperatingSystem | Select-Object OSArchitecture).OSArchitecture
    If ($ARCH -eq '64-bit') {
    $DOUBLEARCHES = (Get-Process -Id $PID).StartInfo.EnvironmentVariables["PROCESSOR_ARCHITECTURE"]
    If ($DOUBLEARCHES -eq 'x86') {
    Write-Host 'Running 32-bit PowerShell on 64-bit Windows'
    $REG = "%WINDIR%\sysnative\reg.exe"
    }
    ElseIf ($DOUBLEARCHES -eq 'amd64') {
    Write-Host 'Running 64-bit PowerShell on 64-bit Windows'
    $REG = "%WINDIR%\system32\reg.exe"
    }
    }Else{
    Write-Host 'Running 32-bit PowerShell on 32-bit Windows'
    $REG = "%WINDIR%\system32\reg.exe"
    }
    Write-Host "$REG"
    }

    ARCHETYPE

Результат

Running 64-bit PowerShell on 64-bit Windows
%WINDIR%\system32\reg.exe

или же

Running 32-bit PowerShell on 64-bit Windows
%WINDIR%\sysnative\reg.exe
0

Возможно, поздно, но стоит рассказать кому-нибудь еще, есть модуль "7zsd_All_x64.sfx", добавьте его в файл конфигурации и архив, и у вас будет 64-битная версия.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .