38

我正在尝试从我们的 32 位 .NET 应用程序运行 64 位可执行文件 (java.exe)。我正在使用Process类和调用cmd /c <command name>以支持所有可能的命令(如dircd)。

问题是我在我的机器上安装了 64 位版本的 JRE,而 java.exe 只能从C:\Windows\System32文件夹 (x64) 中使用。我已经尝试通过调用显式启动 64 位版本,cmd.exe但由于调用进程是 32 位,C:\Windows\System32\cmd.exe它被重定向到。SysWOW64

我还能做些什么来让它工作吗?

编辑整个cmd /c事情有点像红鲱鱼。这不是问题的一部分,能够运行 64 位可执行文件是。

4

7 回答 7

42

您可以暂时禁用对 Process.Start 的调用的文件系统重定向,P/Invoke 的适当 API 是Wow64DisableWow64FsRedirectionWow64RevertWow64FsRedirection

另一种选择是使用 %windir%\sysnative,它在 Windows Vista 及更高版本上可用。

于 2010-01-05T01:55:23.673 回答
16

您所做的是使用 %windir%\sysnative 来解析 64 位 CMD.EXE,然后通过“/c”命令行选项启动其他 64 位程序。

于 2014-02-17T01:46:42.173 回答
6
c:\>set proc
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 70 Stepping 1, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=4601

c:\>c:\windows\sysnative\cmd
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

c:\>set proc
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 70 Stepping 1, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=4601

c:\>
于 2016-05-20T22:42:51.077 回答
3

以防万一这可能会有所帮助.. http://msdn.microsoft.com/en-us/library/aa384187(VS.85).aspx

请注意,如果应用程序显示为显示 UAC 提示,则不会发生重定向。还有一些文件夹免于重定向。

于 2010-01-13T06:02:44.857 回答
1

要通过 64 位 cmd.exe 运行进程/脚本,您可以使用以下命令:

%windir%\SysWOW64\cmd.exe /c %windir%\sysnative\cmd.exe /c ProgramToRun parameters

此解决方案可在 32 位和 64 位进程中通用。


ps
%windir%\sysnative 仅存在于 32 位进程中。
%windir%\SysWOW64 存在于 32 位和 64 位进程中。

于 2021-06-11T19:00:04.140 回答
0

“sysnative”似乎有一些缺点。

示例:当您通过C:\Windows\sysnative\WindowsPowerShell\v1.0\powershell.exe某些 CmdLets 启动 powershell.exe 时,例如Get-AppxProvisionedPackage" and "Get-WindowsCapability不工作/抛出异常:

Get-AppxProvisionedPackage:“将当前目录设置为“C:\Windows\SysNative\WindowsPowerShell\v1.0”时出错:找不到路径“C:\Windows\SysNative\WindowsPowerShell\v1.0”的一部分”

(翻译自德语“Fehler beim Festlegen des aktuellen Verzeichnisses auf "C:\Windows\SysNative\WindowsPowerShell\v1.0": Ein Teil des Pfades "C:\Windows\SysNative\WindowsPowerShell\v1.0" konnte nicht gefunden werden。 ")

运行除 powershell 之外的其他进程可能会出现类似问题(只要进程源目录很重要?)...

于 2019-07-08T12:05:38.480 回答
0

如果您发现自己处于 32 位版本,这里有一种在 cmd 窗口中切换到 64 位 cmd 的方法:

if %PROCESSOR_ARCHITECTURE%==x86 %windir%\sysnative\cmd

或者从 32 位批处理内部有条件地以 64 位执行:

if %PROCESSOR_ARCHITECTURE%==x86 "%windir%\sysnative\cmd" /c "someProgram"

甚至更好:

set "commands=multiple commands & to execute"
if %PROCESSOR_ARCHITECTURE%==x86 ( "%windir%\sysnative\cmd" /c "%commands%" ) else ( %commands% )
于 2020-10-20T16:14:48.297 回答