Leia ramificação de registro x64 do instalador SFX 7-zip via PowerShell

1

Eu quero que meu arquivo de extração automática do 7-zip execute um script do PowerShell depois de extrair os arquivos. Para fazer isso, eu uso o método descrito aqui: link

Após a extração do arquivo, quero executar um script do powershell, então aqui está o meu conteúdo do arquivo config.txt:

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

O arquivo InstallCU.bat inicia o PowerShell:

powershell.exe -ExecutionPolicy Unrestricted -File InstallCU.ps1

Dentro do script do PowerShell, eu faço muitas coisas, incluindo a verificação de algumas chaves do Registro neste ramo:

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

usando o cmd-lets Test-Path e Get-ItemProperty

Eu não testei, mas acho que em computadores de 32 bits tudo vai rodar bem.

Meu problema é que, em sistemas de 64 bits, é lançada a versão de 32 bits (x86) do PowerShell. Quando eu acesso qualquer caminho no registro sob HKLM: \ Software nele, ele está sendo redirecionado para HKLM: \ Software \ Wow6432Node \ e, é claro, não consegue localizar as informações necessárias (porque está na ramificação do Registro de 64 bits) )

Pergunta:

1) Como faço um SFX de 7-zip de 64 bits?

OR

2) Como executo o PowerShell de 64 bits a partir do SFX de 32 bits?

OR

3) Como faço para ler o registro de 64 bits (não Wow6432Node) via powershell de 32 bits? (Embora eu ache que isso é impossível ou aumentará muito a quantidade de código do PowerShell)

OR

Alguma outra sugestão?

    
por Ubeogesh 20.01.2014 / 11:12

2 respostas

0

Aqui está uma função Archetype aninhada para determinar a bitrness do SO + bitness do Powershell. Adicionado sysnative caminho em uma variável para reg.exe para que você possa editar as chaves x64 a partir de um processo de 32 bits. Se você não preferir reg.exe, tenho certeza de que existem outras maneiras de fazer o mesmo truque.

    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

Resultado

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

ou

Running 32-bit PowerShell on 64-bit Windows
%WINDIR%\sysnative\reg.exe
    
por 20.01.2014 / 18:39
0

Provavelmente até tarde, mas vale a pena deixar qualquer outra pessoa saber, existe um módulo "7zsd_All_x64.sfx", adicione-o ao seu arquivo de configuração e arquive e você terá um bit de 64 bits

    
por 12.12.2014 / 22:55