首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VBScript -错误0x80041017 (null)

VBScript -错误0x80041017 (null)
EN

Stack Overflow用户
提问于 2011-03-25 21:20:59
回答 1查看 7K关注 0票数 2

重要更新:

正如Cheran在下面所述,是一个好主意,避免在这个脚本中使用"taskmgr“。我不打算编辑代码,因为我觉得最好尽可能地保留原来的问题,因为这样做会部分地使Cheran的回答和评论无效。

一个替代"taskmgr“的好方法是"CharMap”(用于简单和快速的测试).

运行(32位),我得到了一个正在抛出此错误的脚本:

代码语言:javascript
运行
复制
Script:   C:\test.vbs
Line:     40
Char:     3
Error:    0x80041017
Code:     80041017
Source:   (null)

下面是代码:

代码语言:javascript
运行
复制
Set objWshShell = Wscript.CreateObject("Wscript.Shell")

Set objWshNet = CreateObject("Wscript.Network")
strComputer = objWshNet.ComputerName

Set objWMIService = GetObject("winmgmts:" & _
    "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Dim arrWinTitle(2)
    arrWinTitle(0) = "My Documents"
    arrWinTitle(1) = "Control Panel"

Dim arrProcName(3)
    arrProcName(0) = "'taskmgr.exe'"
    arrProcName(1) = "'calc.exe'"
    arrProcName(2) = "'notepad.exe'"

Sub srBlockWindow(strWinTitle, intWinTitle, strProcName, intProcName)
    i = 0
    Do While i = 0
        If objWshShell.AppActivate(strWinTitle(intWinTitle)) Then
            objWshShell.AppActivate(strWinTitle(intWinTitle))
            Wscript.Sleep 100
            objWshShell.SendKeys "%{F4}"
            Wscript.Sleep 100
        End If

        If intWinTitle = 0 Then
            intWinTitle = intWinTitle + 1
        Else
            intWinTitle = 0
        End If

        Wscript.Sleep 100

        Set colProcesses = objWMIService.ExecQuery _
            ("SELECT * FROM Win32_Process WHERE NAME = " & strProcName(intProcName))

        For Each objProcess In colProcesses
            objProcess.Terminate()
        Next

        If intProcName >= 0 Then
            intProcName = intProcName + 1
        ElseIf intProcName >= 5 Then
            intProcName = 0
        End If

        Set colProcesses = Nothing
    Loop
End Sub

Call srBlockWindow(arrWinTitle, 0, arrProcName, 0)

我已经复习过,但我相信我的脚本对引号没有任何问题。为了清晰起见,我在“每一个.”开头都会出现错误。绳子。

奇怪的是,它将在第一次运行良好,但一旦它循环,这是我得到的错误。因此,它将关闭所有所需的Windows/应用程序,但一旦完成第二次迭代,我就会得到错误。我插入了“”,但这并不能解决这个问题(稍后我会添加它,因为当窗口/进程以脚本所做的关闭/结束/停止尝试同时启动时,它是解决冲突所必需的)。

--我认为这是因为我应该有条件地检查进程是否存在;问题是,我不太清楚如何使用这段代码(我从来没有很好地处理过集合)。有人对如何具体使用此代码执行此操作有建议吗?

我回顾了,并试图编写一个快速的替代脚本,但它并没有真正起作用。下面是代码:

代码语言:javascript
运行
复制
Set service = GetObject("winmgmts:")

Dim arrProcName(3)
    arrProcName(0) = "'taskmgr.exe'"
    arrProcName(1) = "'calc.exe'"
    arrProcName(2) = "'notepad.exe'"

Sub srTest(strProc, intProc)
    i = 0
    Do While i = 0
        For Each Process In Service.InstancesOf("Win32_Process")
            If Process.Name = strProc(intProc) Then
                Process.Name.Terminate
                Process.Terminate
            End If
        Next

        If intProc = 0 Then
            intProc = intProc + 1
        ElseIf intProc >= 3 Then
            intProc = 0
        End If
    Loop
End Sub

Call srTest(arrProcName, 0)

正如您所看到的,我尝试了两个"Process.Terminate“& "Process.Name.Terminate",但是都没有产生任何结果(甚至不是一个错误)。我还用"Wscript.Echo Process.Name“和"Wscript.Echo strProc(intProc)”对其进行了测试,但这两种方法都不起作用。

现在我在这个替代解决方案上失败了,我觉得我在黑暗中疯狂地刺杀解决方案,所以我将把这些深奥的挑战推迟到比我优越得多的社区。

这里可能有几个人正在阅读这篇文章,并想知道为什么我要针对我的文档、控制面板、taskmgr.exe、calc.exe和notepad.exe。几乎每个阅读这篇文章的人可能都能自己推断,但我会确保我对那些需要它的人来说很清楚。我这样做是因为它使测试变得更容易,因为所有这些都可以通过使用"Run“快捷方式(Windows Key + R)来访问,然后输入以下字符串(当然,每次输入一个字符串):

  • 我的文档
  • 控制
  • taskmgr
  • 卡尔克
  • 记事本

您可能知道关键字,但我只想强调为什么我要使用这些特定的关键字(速度和简单性)。

,如果Cheran将最后的代码添加到发布的答案中,我将删除它

最后解决办法:

代码语言:javascript
运行
复制
Set objWshShell = Wscript.CreateObject("Wscript.Shell")

Set objWshNet = CreateObject("Wscript.Network")
strComputer = objWshNet.ComputerName

Set objWMIService = GetObject("winmgmts:" & _
    "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Dim arrWinTitle
    arrWinTitle = Array("My Documents", "Control Panel")

Dim arrProcName
    arrProcName = Array("'charmap.exe'", "'calc.exe'", "'notepad.exe'")

Sub srBlockWindow(strWinTitle, intWinTitle, strProcName, intProcName)
    i = 0
    Do While i = 0
        On Error Resume Next
            ' In the Event of Conflict w/Initiation of Window or Process
        If objWshShell.AppActivate(strWinTitle(intWinTitle)) Then
            objWshShell.AppActivate(strWinTitle(intWinTitle))
            Wscript.Sleep 100
            objWshShell.SendKeys "%{F4}"
            Wscript.Sleep 100
        End If

        intWinTitle = (intWinTitle + 1) Mod (UBound(strWinTitle) + 1)

        Wscript.Sleep 100

        Set colProcesses = objWMIService.ExecQuery _
            ("SELECT * FROM Win32_Process WHERE NAME = " & strProcName(intProcName))

        For Each objProcess In colProcesses
            objProcess.Terminate()
        Next

        intProcName = (intProcName + 1) Mod (UBound(strProcName) + 1)

        Set colProcesses = Nothing
    Loop
End Sub

Call srBlockWindow(arrWinTitle, 0, arrProcName, 0)

下面是一个我拼凑在一起测试它的快速脚本:

代码语言:javascript
运行
复制
Set objWshShell = Wscript.CreateObject("Wscript.Shell")

i = 0
Do While i = 0
    objWshShell.Run "explorer.exe /e, C:\Documents and Settings\User\My Documents"
    Wscript.Sleep 200
    objWshShell.Run "CharMap.exe"
    Wscript.Sleep 200
    objWshShell.Run "Control.exe"
    Wscript.Sleep 200
    objWshShell.Run "calc.exe"
    Wscript.Sleep 200
    objWshShell.Run "notepad.exe"
    Wscript.Sleep 200
Loop

小心点!调整时间,以便您可以结束"Wscript.exe“没有太多的问题。最好同时运行两个脚本,看看它是如何工作的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-26 22:00:04

我发现了两大问题:

  1. 这里的主要问题在于定义数组的方式。数组声明中指定的数字是最大的数组下标。由于VBScript数组总是从0开始进行索引,因此实际上需要指定一个比数组中的元素数少一个。 “这是错误的: Dim arrWinTitle(2) Dim arrProcName(3)”应该是: Dim arrWinTitle(1) Dim arrProcName(2) 还可以使用Array函数初始化数组,前提是您事先知道数组中有多少元素。在这种情况下,您只需将arrWinTitle声明为变体而不是数组: Dim arrWinTitle arrWinTitle =Array(“我的文档”,“控制面板”)
  2. 如果您进行了更改,并尝试运行脚本,您仍然会得到一个“子脚本超出范围”错误。这个错误是由这个块引起的: 如果intProcName >= 0,则intProcName = intProcName +1 ElseIf intProcName >= 5,则intProcName =0结束 首先,strProcName的最大下标应该是2,而不是5。即使这样,这段代码也不能工作。似乎您要做的是循环遍历数组的元素,然后从0开始。这样做的一个更好方法是使用Mod操作符: intProcName = (intProcName + 1) Mod (UBound(strProcName) + 1) 还请注意如何使用UBound函数来避免对数组的实际长度进行硬编码。

我不会花太多时间来分析您的第二个示例,因为它只是尝试使第一个示例工作。但是,我要注意的是,在arrProcName数组中,进程名仍然有单引号,这也是脚本无法工作的原因之一。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5438259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档