【问题标题】:WMI Scripting Windows 8 errorWMI 脚本 Windows 8 错误
【发布时间】: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


【解决方案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 并且它终于可以工作了。感谢所有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多