如何从Powershell运行Powershell x86?

8

然而,这个问题是什么引起的呢? - Bill_Stewart
@Bill_Stewart 我想编写一个脚本,可以为我启动开发工具。 - VSO
运行x86版本的PowerShell如何帮助您解决问题?您试图解决什么问题? - Bill_Stewart
1
赏金描述中指出:“这些都没有打开x86版本”,您能否更新问题以澄清到底是什么让您相信这一点,以及您期望发生什么? - Mathias R. Jessen
1
@VSO,请更新一下吗?我们中的一些人在评论中提出了额外的问题。如果您已经找到了解决方案,能否请您为其他人发布一下呢? - PSGuy
显示剩余5条评论
7个回答

17
Start-Process $Env:WINDIR\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

6

我建议使用Caleb的答案。但是个人而言,我在PowerShell配置文件中有一个函数,它会在启动时加载并在运行x86时启动一个新的PowerShell x86 shell,因为这是如此常见的需求。

Function x86{
    Start-Process $($env:SystemRoot + "\syswow64\WindowsPowerShell\v1.0\powershell.exe")
}

注意:这里的$env:windir$env:SystemRoot是等价的。但并不总是如此。


2

您需要完整路径来访问x86 Powershell可执行文件。如果您是从命令提示符(CMD.EXE)启动它,您将使用以下命令:

start "" "%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"

如果您是从PowerShell会话开始的,您需要使用以下命令:

start "" "$env:SystemRoot\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"

或者

Start-Process -FilePath "$env:SystemRoot\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"

2

如果想快速解决问题,我认为这个解决方案会对你有所帮助。

start 'C:\Users\(Your-username here)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell\Windows PowerShell (x86).lnk'

请注意,这只是一个快速修复方法。
以下代码将动态地切换PowerShell以在64位模式下运行。
if ($env:PROCESSOR_ARCHITEW6432 -eq "AMD64") {
    write-warning "Y'arg Matey, we're off to 64-bit land....."
    if ($myInvocation.Line) {
        &"$env:WINDIR\sysnative\windowspowershell\v1.0\powershell.exe" -NonInteractive -NoProfile $myInvocation.Line
    }else{
        &"$env:WINDIR\sysnative\windowspowershell\v1.0\powershell.exe" -NonInteractive -NoProfile -file "$($myInvocation.InvocationName)" $args
    }
exit $lastexitcode
}
 
 
write-host "Main script body"

2
当我上次需要运行32位版本的PowerShell时,是为了某个特定目的(我需要访问一个没有64位版本的DLL,参考链接:查看智能卡上的所有证书)。在这种情况下,我只需使用-RunAs32开关为New-Job执行所需代码作为后台作业。最终使用的完整代码可以在引用的问题中找到,但一般概念如下:
$RunAs32Bit = {

Do some stuff that requires 32-bit

}

#Run the code in 32bit mode if PowerShell isn't already running in 32bit mode
If($env:PROCESSOR_ARCHITECTURE -ne "x86"){
    Write-Warning "Non-32bit architecture detected, collecting certificate information in separate 32bit process."
    $Job = Start-Job $RunAs32Bit -RunAs32
    $SCStore = $Job | Wait-Job | Receive-Job
}Else{
    $SCStore = $RunAs32Bit.Invoke()
}

谢谢,非常棒的答案!我发现它对于操作.NET Framework 32/64位版本的配置非常有帮助。链接在这里:https://stackoverflow.com/questions/39925805/writing-to-the-machine-config-file-in-powershell - LordMsz

0

下载PSExec

然后,在PowerShell中运行以下命令:PATH_TO_PSEXEC\psexec.exe -i powershell


0

核心结构包括在任何情况下传递参数的方式如下所示

Param(
    [String] $Param1 =@("Param1"),
    [String] $Param2 =@("Param2")
)
    $ScriptLocation = Split-Path $script:MyInvocation.MyCommand.Path -Parent
    Write-Host $ScriptLocation

$RunAs32Bit = {
    Param(
    [String] $Param1 =@("Param1"),
    [String] $Param2 =@("Param2")
    )
    ...        

    return $Result  
}

#Run the code in 32bit mode if PowerShell isn't already running in 32bit mode
If($env:PROCESSOR_ARCHITECTURE -ne "x86"){
    Write-Warning "Non-32bit architecture detected, processing original request in separate 32bit process."
    $Job = Start-Job $RunAs32Bit -RunAs32 -ArgumentList ($Param1, $Param2, $ScriptLocation)
    $Result = $Job | Wait-Job | Receive-Job
}Else{
    $Result = Invoke-Command -ScriptBlock $RunAs32Bit -ArgumentList ($Param1, $Param2, $ScriptLocation)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接