2013-09-27 12 views
28

Ich weiß, es ist eine seltsame Frage, aber ich bin in einem Drittanbieter gesperrt, der eine 32-Bit-cmd.exe auf einem Ziel 64-Bit-Windows Server 2008 R2-Cluster-Server startet. Von hier möchte ich ein 64-Bit-PowerShell-Fenster starten und ein Skript ausführen.Wie 64-Bit-Powershell von 32-Bit-cmd.exe zu starten?

Hier ist mein Test:

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

Wenn ich dies von einem cmd.exe 32-Bit laufen bekomme ich nichts zurückgegeben. Wenn ich von einem 64-Bit cmd.exe laufen erhalte ich:

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

Alle Ideen, was ich tun kann, einen 64-Bit-Powershell-Skript von einem 32-Bit-cmd Shell aufzurufen?

Antwort

61

Mit syswow64 können Sie 32-Bit-System-Executables aus 64-Bit-Code ausführen. Mit sysnative können Sie 64-Bit-System-Executables aus 32-Bit-Code ausführen.

So müssen Sie ausführen:

% SystemRoot% \ Sysnative \ Windows \ v1.0 \ powershell.exe

+1

Einfach schlagen Sie mich zum Schlag. :-) –

+5

Ich habe Windows 7 Enterprise 64-Bit und ich bekomme "Das System kann den angegebenen Pfad nicht finden", wenn ich dies verwende. Die Zeile, die für 64-Bit-Powershell funktioniert, lautet:% systemroot% \ syswow64 \ windowspowershell \ v1.0 \ powershell.exe – dotnetguy

+11

@misrud ist falsch. Der Aufruf von% systemroot% \ syswow64 \ windowspowershell \ v1.0 \ powershell.exe von 32-Bit-cmd.exe bringt Ihnen die 32-Bit-Powershell. Sie können dies überprüfen mit 'ls env:' Die 32-Bit-Version wird 'PROCESSOR_ARCHITECTURE' als' x86' anzeigen. Darüber hinaus enthält 'syswow64' nur 32-Bit-Äquivalente von 64-Bit-DLLs und EXEs. –

7

This script wird überprüfen, wie sehen, welche Version von Powershell Sie ausgeführt werden und wird sich Relaunch zu 64-Bit, wenn Sie in 32-Bit ausgeführt werden. Wenn der Relaunch stattfindet, werden auch alle Parameter übergeben, die im ursprünglichen Aufruf verwendet wurden.

############################################################################# 
#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 
#############################################################################  
+0

Sie haben meinen Speck gerettet! Ich konnte keine IIS-Powershell-Cmdlets über die PowerShell-Shell des Konfigurationsverwaltungstools SaltStack ausführen, und es stellte sich heraus, dass sie in 32 Bit (!!) und IIS 64 erforderlich waren. Das Anhängen an meine Skripte speicherte es. Sehr gut. –

+0

Einfach, elegant und es funktioniert, schön. – DaveBally