【问题标题】:How to launch 64-bit powershell from 32-bit cmd.exe?如何从 32 位 cmd.exe 启动 64 位 powershell?
【发布时间】:2013-09-27 16:38:52
【问题描述】:

我知道这是一个奇怪的问题,但我被锁定在第三方供应商中,该供应商在目标 64 位 Windows Server 2008 R2 集群服务器上启动 32 位 cmd.exe。从这里我想启动一个 64 位 PowerShell 窗口并运行一个脚本。

这是我的测试:

powershell.exe "Get-Module -ListAvailable| Where-Object {$_.name -eq 'FailoverClusters'}"

如果我从 32 位 cmd.exe 运行它,我不会得到任何返回。如果我从 64 位 cmd.exe 运行,我会得到:

ModuleType Name                      ExportedCommands
---------- ----                      ----------------
Manifest   FailoverClusters          {}

关于如何从 32 位 cmd shell 调用 64 位 powershell 脚本有什么想法吗?

【问题讨论】:

    标签: powershell cmd


    【解决方案1】:

    syswow64 允许您从 64 位代码运行 32 位系统可执行文件。 sysnative 让您可以从 32 位代码运行 64 位系统可执行文件。

    所以,你需要运行:

    %SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe
    

    【讨论】:

    • 我有 Windows 7 Enterprise 64 位,如果我使用它,我会得到“系统找不到指定的路径”。所以适用于我运行 64 位 powershell 的行是:%systemroot%\syswow64\windowspowershell\v1.0\powershell.exe
    • @mishrud 搞错了。从 32 位 cmd.exe 调用 %systemroot%\syswow64\windowspowershell\v1.0\powershell.exe 可以获得 32 位 powershell。您可以使用ls env: 验证这一点。32 位版本会将PROCESSOR_ARCHITECTURE 显示为x86 此外,syswow64 仅包含 64 位 DLL 和 EXE 的 32 位等效项。
    • 它在 Win10 上适用于我,但我注意到选项卡完成在 sysnative 上不起作用。
    • 请注意,此命令仅在从 64 位系统上的 32 位进程运行时有效。如果您尝试从 64 位进程运行它,它将无法正常工作。 sysnative 重定向器仅适用于 32 位进程。
    • 我使用的是 Windows 10,我遇到了安装 64 位模块的问题。我没有找到“sysnative”目录。所以我尝试使用在路径"C:\Windows\System32\WindowsPowerShell\v1.0" 中找到的 Pwershell.exe。可以使用这个exe成功安装64位模块。
    【解决方案2】:

    This script 将检查您正在运行的 powershell 版本,如果您在 32 位中运行,它将重新启动到 64 位。重新启动时,它还将传递原始调用中使用的任何参数。

    #############################################################################
    #If Powershell is running the 32-bit version on a 64-bit machine, we 
    #need to force powershell to run in 64-bit mode .
    #############################################################################
    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"
    
    #############################################################################
    #End
    #############################################################################    
    

    【讨论】:

    • 你救了我的培根!我无法通过配置管理工具 SaltStack 的 powershell shell 执行 IIS powershell cmdlet,结果发现它是以 32 位(!!)执行它们,而 IIS 需要 64 位。将其附加到我的脚本中保存了它。非常好。
    • 很高兴我 11 年前的代码还活着。你也可以在这里投票:stackoverflow.com/a/8749393/1133043
    • 这对我有帮助!我在尝试通过 azure DevOps PS 任务执行 PowerShell 脚本时遇到了问题。我希望脚本在 64 位实例上执行。自托管代理有两个 PowerShell 实例,32 位和 64 位,而无论我做什么,DevOps 任务最终都使用 32 位 Powershell。
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 2017-10-25
    • 2011-01-01
    • 2019-12-17
    • 2013-03-11
    • 2010-09-14
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多