WMI 脚本 Windows 8 错误
Posted
技术标签:
【中文标题】WMI 脚本 Windows 8 错误【英文标题】:WMI Scripting Windows 8 error 【发布时间】: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
(只是一个测试)并且它有效!我仍然不知道发生了什么......
【参考方案1】:
替换这个:
$perflist = (get-wmiobject Win32_Win32_PerfFormattedData_PerfProc_Process)
用这个:
$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
【讨论】:
谢谢你的帮助,伙计,我在这里写错了我的代码(我是从另一台机器上复制的) @NickG。然后您需要更改您的问题,因为错误表明这是问题所在。您仍然收到无效的查询吗? @Matt 我不明白你的帮助,错误不在于从“Win32_Win32_PerfFormattedData_PerfProc_Process”中删除“Win32”,但它在于 Windows 8 不允许独立应用程序使用 WMI。 【参考方案2】:当您使用 x32 应用程序时,Windows 8 无法完美执行 WMI 操作,我制作了一个虚拟 x64 应用程序,它执行 *.bat 并且它终于可以工作了。感谢所有帮助。
【讨论】:
以上是关于WMI 脚本 Windows 8 错误的主要内容,如果未能解决你的问题,请参考以下文章