VBScript程序错误地识别其PID?

VBScript程序错误地识别其PID?,vbscript,wmi,wsh,wbem,Vbscript,Wmi,Wsh,Wbem,每次我需要授予用户访问服务器上文件共享的权限时,我都会多次出现此弹出窗口,因为该过程会访问各种文件,我无法修改这些文件的访问权限: 这不是一个问题,但我厌倦了反复停止我正在做的事情,然后单击“继续”按钮。所以,我编写了一个程序,不断扫描应用安全窗口的错误,每当它发现一个错误时,发送一个回车键。这已经足够好了,但是由于中央循环从未终止,我决定添加在程序完成时结束程序的功能。我本可以使用一个.hta文件,但我决定尝试一种不同的方法,将所有内容保存在一个文件中,以便于将来的维护。我采用了中的代码来查找

每次我需要授予用户访问服务器上文件共享的权限时,我都会多次出现此弹出窗口,因为该过程会访问各种文件,我无法修改这些文件的访问权限:

这不是一个问题,但我厌倦了反复停止我正在做的事情,然后单击“继续”按钮。所以,我编写了一个程序,不断扫描应用安全窗口的错误,每当它发现一个错误时,发送一个回车键。这已经足够好了,但是由于中央循环从未终止,我决定添加在程序完成时结束程序的功能。我本可以使用一个.hta文件,但我决定尝试一种不同的方法,将所有内容保存在一个文件中,以便于将来的维护。我采用了中的代码来查找程序的PID,并允许在关闭弹出窗口后使用Windows TASKKILL命令结束程序

程序似乎工作正常,识别其PID并将其传递给弹出窗口。然而,当TASKKILL运行时,它声称PID不存在。有人能看出我做错了什么吗?提前感谢所有回复的人

'  AutoContinue.vbs
'  Program to automatically close all "Error Applying Security" messages

Option Explicit

Const Hidden = 0
Dim objWshShell, objWMILocator, objWMIService
Dim strComputerName, objArgs, objChildProcess, colPIDs, objPID

Set objWshShell = CreateObject( "WScript.Shell" )
Set objWMILocator = CreateObject( "WBemScripting.SWbemLocator" )
Set objWMIService = objWMILocator.ConnectServer( "", "", "", "" )

Function MyProcessID ()
' MyProcessID finds and returns my own PID.

    MyProcessID = 0
    Set objChildProcess = objWshShell.Exec( "%comspec% /C pause" )
    Set colPIDs= objWMIService.ExecQuery( "Select * From Win32_Process" & _
        " Where ProcessId=" & objChildProcess.ProcessID,, 0 )
    For Each objPID In colPIDs
        MyProcessID = objPID.ParentProcessID
    Next
    Call objChildProcess.Terminate()
End Function

Set objArgs = WScript.Arguments
If objArgs.Count = 1 Then
    If objArgs.Item(0) = "Popup" Then
        objWshShell.Popup( "AutoContinue PID is " & MyProcessID & _
            vbCrLf & "Hit OK when done." )
'        objWshShell.Run "taskkill /PID " & MyProcessID & " /T", 1
        objWshShell.Run "%comspec% /k taskkill /PID " & MyProcessID & " /T", 1
        Set objArgs = Nothing
        Set objWshShell = Nothing
        WScript.Quit
    End If
End If

objWshShell.Run "wscript.exe " & WScript.ScriptName & " Popup", Hidden

Do
    Do
        WScript.Sleep( 500 )
    Loop While Not objWshShell.AppActivate( "Error Applying Security" )
    WScript.Sleep( 100 )
    objWshShell.AppActivate( "Error Applying Security" )
    WScript.Sleep( 100 )
    objWshShell.SendKeys( "{ENTER}" )
Loop While True

Set objWshShell = Nothing

脚本正确地标识自己的PID。但是,您正试图使用提供的弹出参数杀死脚本实例本身,而您需要在没有弹出参数的情况下杀死脚本实例,或者使用另一个第一个参数?杀死脚本实例

以下解决方案可能会有所帮助:提供要终止的实例的PID作为第二个参数,请参阅变量iPid以及弹出的参数


约瑟夫兹,这奏效了。我更进一步,删除了函数声明,将代码放入程序主体中。谢谢你的帮助!
'  AutoContinue.vbs
'  Program to automatically close all "Error Applying Security" messages
Option Explicit
Const Hidden = 0
Dim objWshShell, objWMILocator, objWMIService
Dim strComputerName, objArgs, objChildProcess, colPIDs, objPID

Set objWshShell = CreateObject( "WScript.Shell" )
Set objWMILocator = CreateObject( "WBemScripting.SWbemLocator" )
Set objWMIService = objWMILocator.ConnectServer( "", "", "", "" )

Function MyProcessID ()
' MyProcessID finds and returns my own PID.

    MyProcessID = 0
    Set objChildProcess = objWshShell.Exec( "%comspec% /C pause" )
    Set colPIDs= objWMIService.ExecQuery( "Select * From Win32_Process" & _
        " Where ProcessId=" & objChildProcess.ProcessID,, 0 )
    For Each objPID In colPIDs
        MyProcessID = objPID.ParentProcessID
    Next
    Call objChildProcess.Terminate()
End Function

Dim iPid
iPid = MyProcessID()

Set objArgs = WScript.Arguments
If objArgs.Count >= 2 Then
    If objArgs.Item(0) = "Popup" Then
        objWshShell.Popup( "AutoContinue PID is " & objArgs.Item(1) & _
            vbCrLf & "Hit OK when done." )
'        objWshShell.Run "taskkill /PID " & objArgs.Item(1) & " /T /F", 1
        objWshShell.Run "%comspec% /k taskkill /PID " & objArgs.Item(1) & " /T /F", 1
        Set objArgs = Nothing
        Set objWshShell = Nothing
        WScript.Quit
    End If
End If

objWshShell.Run "wscript.exe """ _
    & WScript.ScriptFullName & """ Popup " & CStr( iPid) , Hidden
''                                 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ two arguments

Do
     Do
        WScript.Sleep( 500 )
     Loop While Not objWshShell.AppActivate( "Error Applying Security" )
     WScript.Sleep( 100 )
     objWshShell.AppActivate( "Error Applying Security" )
     WScript.Sleep( 100 )
     objWshShell.SendKeys( "{ENTER}" )
Loop While True