web-dev-qa-db-ja.com

32ビットcmd.exeから64ビットPowerShellを起動する方法は?

奇妙な質問であることは知っていますが、ターゲットの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シェルから64ビットのPowerShellスクリプトを呼び出すためにできることについてのアイデアはありますか?

32
Mark Allison

syswow64では、64ビットコードから32ビットシステム実行可能ファイルを実行できます。 sysnativeを使用すると、32ビットコードから64ビットシステム実行可能ファイルを実行できます。

したがって、実行する必要があります:

%SystemRoot%\sysnative\WindowsPowerShell\v1.0\powershell.exe
80
Jason Shirk

このスクリプト は、実行している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
#############################################################################    
12