我正在寻找一个解决方案来定位在我的 Windows Seven 64 系统上哪些进程在 64 位上运行以及哪些进程在 32 位上运行,是否有一个简单的 Windows shell 命令可以做到这一点???
答案1
经过一番思考,我意识到 WMIC 方法有点不靠谱。更好的方法是使用如下所示的 PowerShell 脚本:
[System.Diagnostics.Process[]] $processes64bit = @()
[System.Diagnostics.Process[]] $processes32bit = @()
foreach($process in get-process) {
$modules = $process.modules
foreach($module in $modules) {
$file = [System.IO.Path]::GetFileName($module.FileName).ToLower()
if($file -eq "wow64.dll") {
$processes32bit += $process
break
}
}
if(!($processes32bit -contains $process)) {
$processes64bit += $process
}
}
write-host "32-bit Processes:"
$processes32bit | sort-object Name | format-table Name, Id -auto
write-host ""
write-host "64-bit Processes:"
$processes64bit | sort-object Name | format-table Name, Id -auto
如果将其复制到 PowerShell 脚本中,将其命名为 process-width.ps1,然后在 PowerShell 中运行它,它将列出所有 32 位进程,然后是 64 位进程。
它通过检查进程是否将 wow64.dll 作为模块加载到其进程空间中来实现这一点。wow64.dll 是适用于 64 位操作系统的 Windows 32 位模拟层。它只会由 32 位进程加载,因此检查它是了解进程是否为 32 位的可靠方法。
作为一个长期解决方案,这应该会发挥更好的作用。
答案2
wmic process get
将列出系统上的所有进程。您可以传递参数来获取 WMI Win32_Process 属性。您可以在此处找到该列表:
http://msdn.microsoft.com/en-us/library/aa394372(v=vs.85).aspx
其中一个可能显示该进程是 64 位还是 32 位。
e:没有直接属性,但您可以执行以下操作:
wmic process get Name, MaximumWorkingSetSize
如果 MaximumWorkingSetSize 返回的数字大于 3096,那么它肯定是一个 64 位进程。在我的计算机上,64 位进程的 MaximumWorkingSetSize 为 32768(即 32gb),而 32 位进程的 MaximumWorkingSetSize 为 1380,这是我的交换文件的调整大小。无论如何,简单的检查是:
MaximumWorkingSetSize > 3096 == 64-bit
答案3
如果您安装了 Visual Studio,那么您可以简单地从 Visual Studio 命令提示符中使用 dumpbin.exe 来转储可执行头:
dumpbin.exe /HEADERS file.exe
对于 x86 二进制文件,机器头为 14C,对于 x64,机器头为 8664:
x86:
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
x64
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
8664 machine (x64)
答案4
很简单,只需启动任务管理器即可。带有 *32 的进程是 32 位应用程序