Я пытаюсь распечатать (в текстовый файл) информацию о фрагментации, предоставляемую классом Win32_Volume, используя метод DefragAnalysis, и придумала следующий код VB.NET:
Dim objReader As StreamWriter
objReader = New StreamWriter(FolderBrowserDialog.SelectedPath + "\FragInfo" + "_" + CreationDate + ".txt")
Dim colItemsFragInfo As New ManagementObjectSearcher("root\CIMV2", "Select * from Win32_Volume where DriveType = 3")
For Each queryObj As ManagementObject In colItemsFragInfo.Get()
objReader.WriteLine("Analyzing volume " + queryObj("DriveLetter"))
Dim InParams As ManagementBaseObject = queryObj.GetMethodParameters("DefragAnalysis")
Dim OutParams As ManagementBaseObject = queryObj.InvokeMethod("DefragAnalysis", InParams, Nothing)
MsgBox(OutParams("VolumeSize"))
objReader.WriteLine(" Volume size: " + OutParams("VolumeSize"))
Next
objReader.Close()
Catch err As ManagementException
MessageBox.Show("An error occurred while trying to execute the WMI method: " & err.Message)
End Try
То, что я не могуразобраться в том, как получить информацию о параметре (например, "VolumeSize") из метода "DefragAnalysis".Приведенный выше код возвращает «Ошибка метода не найдена».
Спасибо
-Edit Это то, что в настоящее время работает при выполнении в WMI Code Creator:
Imports System
Imports System.Management
Imports System.Windows.Forms
Namespace WMISample
Public Class MyWMIQuery
Public Overloads Shared Function Main() As Integer
Try
Dim colItemsVolInfo As New ManagementObjectSearcher("root\CIMV2", "Select * from Win32_Volume where DriveType = '3'")
For Each queryObj As ManagementObject In colItemsVolInfo.Get()
Dim OutParams As ManagementBaseObject = queryObj.InvokeMethod("DefragAnalysis", Nothing, Nothing)
Console.WriteLine(" Volume size: {0}MB", Math.Round(OutParams("DefragAnalysis")("VolumeSize")) * (9.53674316 * 10 ^ -7))
Console.WriteLine(" Cluster size: {0}MB", Math.Round(OutParams("DefragAnalysis")("ClusterSize")) * (9.53674316 * 10 ^ -7))
If OutParams("DefragRecommended") = True Then
Console.WriteLine("You should defragment this volume.")
Else
Console.WriteLine("You do not need to defragment this volume.")
End If
Next
Catch err As ManagementException
MessageBox.Show("An error occurred while trying to execute the WMI method: " & err.Message)
End Try
End Function
End Class
End Namespace
WMI Выход: Размер тома: 40857.9960763451MB Размер кластера: 0.003906249998336MBВам не нужно выполнять дефрагментацию этого тома.
Однако выполнение этого в Visual Studio возвращает следующее: Размер тома: МБ Размер кластера: МБ Вам не нужно дефрагментировать этот том.
Точказдесь, хотя он НЕ работает под Windows Server 2008 R2, но работает под Windows Server 2003 (при выполнении в Visual Studio), код WMI будет работать независимо от платформы.
Примечание: я играл с "Console.WriteLine "и изменил его на" Debug.WriteLine ", чтобы вывести значение в непосредственное окно.