2016-01-07 3 views
1

У меня проблема с WMI в машине с Windows 8 Home Edition. Мне нужно поймать использование ЦП и ProcessID по процессу. Я пытался так много способов:WMI Scripting Windows 8 error

  • ShellExecute в Delphi
  • A * .bat с кодом
  • A * .vbs
  • A * .vbs, выполняемом * .bat
  • A * .ps1
  • A * .ps1 выполняется с помощью * .bat

(может быть, некоторые из этих способов может быть очень глупо, но я пытался так или иначе)

В User-Click работает отлично, но по отдельному заявлению он не работает. Я открыл Защиту на WMIMGMT.msi некоторых папок, и политика выполнения (в PowerShell) теперь НЕРАЗРЕШАЕТ.

Это код на * .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 : Invalid query "select * from Win32_Win32_PerfFormattedData_PerfProc_Process" 
In C:\Somefolder\PP.ps1:4 character: 14 
+ $perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process) 
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Get-WmiObject], ManagementException 
    + FullyQualifiedErroID : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Редактировать 1: Код скопирован спрашивает:

  • * .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 = Недопустимый запрос; Нет = в; 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 
    
+0

Можете ли вы запросить другие вещи с помощью WMI? – Matt

+1

Сообщение об ошибке в вашем вопросе было вызвано недопустимым именем класса ('Win32_Win32_PerfFormattedData_PerfProc_Process'), которое вы исправили. Вы все еще получаете ошибку? –

+0

Я не тестировал другой класс с WMI.Если вы можете сказать мне код для проверки, я буду благодарен И чтобы объяснить, код в машине win8 был прав, но я написал неправильный код здесь –

ответ

0

Windows 8 не выполняет действия WMI прекрасно, когда вы используете x32 приложения, I сделал фиктивное приложение x64, которое выполняет * .bat, и оно наконец работает. Спасибо за помощь.

0

заменить это:

$perflist = (get-wmiobject Win32_Win32_PerfFormattedData_PerfProc_Process) 

с этим:

$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process) 
+0

Спасибо за помощь, чувак, но я написал неправильный код здесь (я копирую с другой машины) –

+1

@NickG. Затем вам нужно изменить свой вопрос, поскольку ошибка указала, что это проблема. Вы по-прежнему получаете недопустимый запрос? – Matt

+0

@Matt Я не понял вашу помощь, ошибка не заключается в удалении «Win32» из «Win32_Win32_PerfFormattedData_PerfProc_Process», но она состоит в том, что в Windows 8 не разрешены автономные аппликации WMI. –