【发布时间】:2016-01-07 18:43:58
【问题描述】:
我在装有 Windows 8 家庭版的机器上遇到了 WMI 问题。我需要按进程捕获 CPU 使用率和 ProcessID。我尝试了很多方法:
- Delphi 中的 ShellExecute
- 带有代码的 *.bat
- 一个 *.vbs
- 由 *.bat 执行的 *.vbs
- 一个 *.ps1
- 由 *.bat 执行的 *.ps1
(也许其中一些方法真的很愚蠢,但我还是尝试过)
在用户点击中它完美地工作,但通过独立申请它不起作用。 我已经打开了一些文件夹的 WMIMGMT.msi 上的安全性,现在执行策略(在 PowerShell 中)是 UNRESTRICTED。
这是 *.ps1 文件中的代码:
$ErrorActionPreference = "SilentlyContinue"
Stop-Transcript | Out-Null
$ErrorActionPreference = "Continue"
$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
foreach ($p in $peflist) {
"" + $p.IDProcess + ";" + $p.PercentProcessTime
}
这是 *.bat 上的代码
powershell -ExcetutionPolicy Unrestricted -File "C:\Somefolder\PP.ps1" > C:\SomeFolder\output.txt
我得到的只是这个输出:
get-wmiobject:无效查询“从 Win32_Win32_PerfFormattedData_PerfProc_Process 中选择 *”
在 C:\Somefolder\PP.ps1:4 字符:14
+ $perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErroID : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
Edit1:按要求复制的代码:
-
*.ps1:
$ErrorActionPreference="SilentlyContinue" Stop-Transcript | out-null $ErrorActionPreference = "Continue" $perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process) foreach ($p in $perflist) { "" + $p.IDProcess + ";" + $p.PercentProcessorTime } -
*.bat
powershell -executionPolicy unrestricted -file "C:\MonitorPerformance\test.ps1" > C:\MonitorPerformance\output1.txt -
输出:(Consulta inválida = 无效查询;否 = in;caractere = 字符)
get-wmiobject : Consulta inv lida "select * from Win32_PerfFormattedData_PerfProc_Process" No C:\MonitorPerformance\test.ps1:4 caractere:14 + $perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Get-WmiObject], ManagementException + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
【问题讨论】:
-
你能用 WMI 查询其他东西吗?
-
您问题中的错误消息是由无效的类名 (
Win32_Win32_PerfFormattedData_PerfProc_Process) 引起的,您已更正。您仍然收到错误消息吗? -
我没有用 WMI 测试过另一个类。如果你能告诉我一个代码来测试,我将不胜感激并解释一下,win8机器上的代码是正确的,但我这里的代码写错了
-
是的,我仍然有错误
-
我得到消息,我将
$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process) foreach ($p in $peflist) { "" + $p.IDProcess + ";" + $p.PercentProcessTime }更改为:get-wmiobject Win32_OperatingSystem(只是一个测试)并且它有效!我仍然不知道发生了什么......
标签: powershell windows-8 wmi windows-scripting