【发布时间】:2021-04-23 16:43:34
【问题描述】:
我在尝试将脚本从 VBScript 更新到标准 VB 时遇到了问题。该脚本仅检查 Excel 的任何正在运行的进程,然后确定它们运行了多长时间,如果该时间超过 4 分钟,则将其关闭。 这是脚本:
Imports System
Module Program
Sub Main()
Dim objWMIService As Object, objProcess, colProcess, startDate, timeDiff
objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
colProcess = objWMIService.ExecQuery("Select * from Win32_Process Where Name = " & "'EXCEL.EXE'")
For Each objProcess In colProcess
startDate = WMIDateStringToDate(objProcess.creationdate)
timeDiff = DateDiff("n", startDate, Now)
If timeDiff > 4 Then
objProcess.Terminate()
End If
Next
End Sub
Function WMIDateStringToDate(dtmInstallDate As String) As Date
WMIDateStringToDate = CDate(
Mid(dtmInstallDate, 5, 2) & "/" &
Mid(dtmInstallDate, 7, 2) & "/" &
Left(dtmInstallDate, 4) & " " &
Mid(dtmInstallDate, 9, 2) & ":" &
Mid(dtmInstallDate, 11, 2) & ":" &
Mid(dtmInstallDate, 13, 2))
End Function
End Module
总的来说,脚本应该可以工作。但是,有一件事不想工作 - 调用 GetObject。我在 Visual Studio 中编码,它给了我错误 BC30451(未声明“GetObject”)。我理解错误的含义,但我的问题是,为什么 GetObject 不存在?不是 Visual Basic 的内置函数吗?
我尝试将 GetObject 切换为 CreateObject,但我觉得将其更改为 CreateObject 并不能解决我的问题。另外,当我这样做时,我得到了“无法创建 ActiveX 组件”错误,所以这是另一个死胡同。
我是否遗漏了诸如对图书馆的引用之类的东西或类似的想法?我的语法有点不对劲吗?我试图阅读文档,但除了使用 GetObject 之前的 Set 语句之外,文档和我的代码之间似乎没有什么不同。但是 Visual Studio 告诉我 Let 和 Set 无论如何都已经过时了。
感谢任何可以帮助我解决这个问题的人
【问题讨论】:
-
查看示例here,使用
System.Management。顺便说一句,要转换日期,您可以使用 ManagementDateTimeConverter 类。 -
使用WMI Code Creator utility,它会自动编写你需要的vb.net代码。
-
使用您建议 Hans 的 WMI Code Creator 实用程序,我已经开始让事情重新开始了。谢谢你的建议。我现在遇到另一个问题,我要导入的命名空间(systems.management 等)遇到 BC40056 错误(无法找到导入中指定的命名空间或类型)。如果这些导入正常工作,我需要的一些变量类型就没有定义。我在谷歌上四处寻找发生了什么。有什么建议吗?
-
您是否引用了声明这些类型的程序集?如果没有引用包含成员类型声明的程序集,则无法导入命名空间。如果不能访问作为特定命名空间成员的至少一种类型,则该命名空间不存在。
-
代码能编译吗?听起来您可能创建了一个 .net 核心控制台项目 - 您想创建一个控制台应用程序(.NET 框架)。如果 createobject 正在编译,并且创建对象失败?那么这是一个不同的问题。至少就能够编译而言,您所拥有的看起来不错。
标签: vb.net