通过 PowerShell 从 7-zip SFX 安装程序读取 x64 注册表分支

通过 PowerShell 从 7-zip SFX 安装程序读取 x64 注册表分支

我希望我的 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 cmd-lets

我没有测试过,但我认为在 32 位计算机上一切都会正常运行。

我的问题是,在 64 位系统上,32 位 (x86) 版本的 PowerShell 启动。当我访问注册表中 HKLM:\Software 下的任何路径时,它会被重定向到 HKLM:\Software\Wow6432Node\,当然,无法找到我需要的信息(因为它位于 64 位注册表分支中)

问题:

1) 如何制作 64 位 7-zip SFX?

或者

2)如何从 32 位 SFX 运行 64 位 PowerShell?

或者

3) 如何通过 32 位 powershell 读取 64 位注册表(不是 Wow6432Node)?(虽然我认为这是不可能的,或者会大大增加 PowerShell 代码的数量)

或者

还有其他建议吗?

答案1

以下是用于确定 OS 位数 + Powershell 位数的嵌套 Archetype 函数。sysnative在变量中添加路径以注册表编辑器因此您可以从 32 位进程中编辑 x64 键。如果您不喜欢 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

答案2

可能太晚了,但值得让其他人知道,有一个模块“7zsd_All_x64.sfx”,将其添加到您的配置文件和存档中,您将拥有一个 64 位

相关内容