ข้อผิดพลาดการเขียนสคริปต์ WMI Windows 8

ฉันมีปัญหากับ WMI ในเครื่องที่ใช้ Windows 8 Home Edition ฉันต้องจับการใช้งาน CPU และ ProcessID ตามกระบวนการ ฉันได้ลองหลายวิธีแล้ว:

  • เชลล์ดำเนินการใน Delphi
  • A *.bat พร้อมรหัส
  • ก *.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
    } 
    
  • *.ค้างคาว

    powershell -executionPolicy unrestricted -file "C:\MonitorPerformance\test.ps1" > C:\MonitorPerformance\output1.txt
    
  • ผลลัพธ์: (Consulta inválida = Invalid Query; No = in; caractere = character)

    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
    

person Nick G.    schedule 07.01.2016    source แหล่งที่มา
comment
คุณสามารถสืบค้นสิ่งอื่น ๆ ด้วย WMI ได้หรือไม่?   -  person Matt    schedule 07.01.2016
comment
ข้อความแสดงข้อผิดพลาดในคำถามของคุณเกิดจากชื่อชั้นเรียนไม่ถูกต้อง (Win32_Win32_PerfFormattedData_PerfProc_Process) ซึ่งคุณแก้ไขแล้ว คุณยังคงได้รับข้อผิดพลาดหรือไม่?   -  person Ansgar Wiechers    schedule 07.01.2016
comment
ฉันยังไม่ได้ทดสอบคลาสอื่นกับ WMI ถ้าบอกรหัสให้ผมทดสอบได้จะขอบคุณครับ และอธิบายให้หน่อยว่าโค้ดในเครื่อง win8 นั้นถูกต้อง แต่ผมเขียนโค้ดผิดตรงนี้   -  person Nick G.    schedule 07.01.2016
comment
ใช่ ฉันยังมีข้อผิดพลาดอยู่   -  person Nick G.    schedule 07.01.2016
comment
ฉันได้รับข่าวว่าฉันเปลี่ยน $perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process) foreach ($p in $peflist) { "" + $p.IDProcess + ";" + $p.PercentProcessTime } เป็น: get-wmiobject Win32_OperatingSystem (แค่ทดสอบ) และใช้งานได้แล้ว! ฉันยังไม่รู้ว่าเกิดอะไรขึ้น...   -  person Nick G.    schedule 07.01.2016
comment
เห็นได้ชัดว่าเป็นไปไม่ได้ที่คุณได้รับข้อผิดพลาดที่คุณโพสต์จากสคริปต์ที่คุณเรียกใช้ get-wmiobject Win32_PerfFormattedData_PerfProc_Process โปรดแก้ไขคำถามของคุณและโพสต์รหัสตรงทั้งหมดและข้อความแสดงข้อผิดพลาด คัดลอกและวาง อย่าถอดความ อย่าพิมพ์จากหน่วยความจำ   -  person Ansgar Wiechers    schedule 08.01.2016
comment
ตกลง ฉันจะพยายามอย่างเต็มที่ (เครื่อง win8 นี้อยู่ในเซิร์ฟเวอร์ในอีกรัฐหนึ่งจากประเทศของฉัน) (และภาษาคือ pt-br ดังนั้นฉันจะแปลอีกครั้ง)   -  person Nick G.    schedule 08.01.2016
comment
@AnsgarWiechers แค่นั้นแหละ   -  person Nick G.    schedule 08.01.2016
comment
คุณสามารถเริ่ม wbemtest เชื่อมต่อและระบุอินสแตนซ์ของคลาสนั้นได้หรือไม่ ลองใช้ WMIDiag ด้วย.   -  person Ansgar Wiechers    schedule 08.01.2016
comment
ฉันสามารถเห็นมันได้ด้วย wbemtest ฉันมีความคิดที่จะสร้างโปรแกรมจำลอง x64 เพื่อรัน *.bat และ... มันใช้งานได้อย่างเหลือเชื่อ! ฉันยังคงเข้าใจอยู่ ไม่พอใจกับ Win8... ขอบคุณสำหรับความช่วยเหลือ   -  person Nick G.    schedule 09.01.2016


คำตอบ (2)


แทนที่สิ่งนี้:

$perflist = (get-wmiobject Win32_Win32_PerfFormattedData_PerfProc_Process)

ด้วยสิ่งนี้:

$perflist = (get-wmiobject Win32_PerfFormattedData_PerfProc_Process)
person Anthony Stringer    schedule 07.01.2016
comment
ขอบคุณสำหรับความช่วยเหลือเพื่อน แต่ฉันเขียนโค้ดผิดที่นี่ (ฉันกำลังคัดลอกจากเครื่องอื่น) - person Nick G.; 07.01.2016
comment
@นิคจี. จากนั้นคุณจะต้องเปลี่ยนคำถามของคุณเนื่องจากข้อผิดพลาดระบุว่านี่คือปัญหา คุณยังคงได้รับข้อความค้นหาที่ไม่ถูกต้องหรือไม่? - person Matt; 07.01.2016
comment
@ Matt ฉันไม่เข้าใจความช่วยเหลือของคุณ ข้อผิดพลาดไม่ได้ประกอบด้วยการลบ Win32 ออกจาก Win32_Win32_PerfFormattedData_PerfProc_Process แต่ประกอบด้วยใน windows 8 ไม่อนุญาตให้ aplicattions แบบสแตนด์อโลนใช้ WMI - person Nick G.; 07.01.2016

Windows 8 ดำเนินการ WMI ได้ไม่สมบูรณ์เมื่อคุณใช้แอปพลิเคชัน x32 ฉันสร้างแอปพลิเคชัน x64 จำลองขึ้นมาซึ่งเรียกใช้งาน *.bat และในที่สุดก็ใช้งานได้ ขอบคุณสำหรับความช่วยเหลือทั้งหมด

person Nick G.    schedule 08.01.2016