Vbscript 从另一个脚本调用最近添加的脚本

Vbscript 从另一个脚本调用最近添加的脚本,vbscript,Vbscript,一旦文件被添加到脚本文件夹中,该代码就会检测到该文件 strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & _ strComputer & "\root\cimv2") Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ (

一旦文件被添加到脚本文件夹中,该代码就会检测到该文件

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
    & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
    & "TargetInstance.GroupComponent= " _
    & "'Win32_Directory.Name=""c:\\\\scripts""'")
Do
    Set objLatestEvent = colMonitoredEvents.NextEvent
    Wscript.Echo objLatestEvent.TargetInstance.PartComponent
Loop

我想在VBScript从此VBScript添加到脚本文件夹后立即执行VBScript。怎么做?获取添加到脚本文件夹的文件的名称,然后执行该VBScript。

用检测到新文件时要执行的代码替换这行代码:
Wscript.Echo objLatestEvent.TargetInstance.PartComponent
。例如,下一个代码片段显示了一种可能的方法(这就是为什么会有宽
Echo
输出,宽于必要的范围…):

注意

  • ShowAbsolutePath(arrFileName(1))
    返回添加到脚本文件夹的文件名;现在你可以
  • 检查它是否是有效的
    .vbs
    文件名,如果是,请将其与任一Windows脚本主机引擎(
    wscript.exe
    cscript.exe
    )组合启动

您可以尝试此修改后的脚本:

If AppPrevInstance() Then 
    MsgBox "There is an existing proceeding !" & VbCrLF &_
    CommandLineLike(WScript.ScriptName),VbExclamation,"There is an existing proceeding !"    
    WScript.Quit   
Else 
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\cimv2")
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
    & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
    & "TargetInstance.GroupComponent= " _
    & "'Win32_Directory.Name=""d:\\\\scripts""'")

    Do
        Set objLatestEvent = colMonitoredEvents.NextEvent
        Call DoWithName(objLatestEvent.TargetInstance.PartComponent)
    Loop
End if
' --------------------------------------
Sub DoWithName( strPartComp)
    Dim Title,arrFileName,Question,ws
    Title = "Execute vbscript"
    set ws = CreateObject("wscript.shell")
    arrFileName = Split( strPartComp, """")
    If True Or UBound(arrFileName) > 0 Then
        Wscript.Echo strPartComp _
        & vbNewLine & UBound( arrFileName) _
        & vbNewLine & "[" & arrFileName( 0)  & "]" _
        & vbNewLine & "[" & arrFileName( 1)  & "]" _
        & vbNewLine & "[" & arrFileName( 2)  & "]" _
        & vbNewLine & DblQuote(ShowAbsolutePath(arrFileName(1)))
    End If
    Question = MsgBox("Did you want to execute this vbscript : " & DblQuote(ShowAbsolutePath(arrFileName(1))),vbYesNo+vbQuestion,Title)
    If Question = vbYes Then
        ws.run DblQuote(ShowAbsolutePath(arrFileName(1)))
    Else
    End if
End Sub
' --------------------------------------
Function ShowAbsolutePath( strPath)
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    ShowAbsolutePath = fso.GetAbsolutePathName( strPath)
End Function
' --------------------------------------
Function DblQuote(Str)
    DblQuote = Chr(34) & Str & Chr(34)
End Function
' --------------------------------------
Function CommandLineLike(ProcessPath)   
    ProcessPath = Replace(ProcessPath, "\", "\\")   
    CommandLineLike = "'%" & ProcessPath & "%'"   
End Function
' --------------------------------------
Function AppPrevInstance()   
    With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")   
        With .ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE " & CommandLineLike(WScript.ScriptFullName) & _
            " AND CommandLine LIKE '%WScript%' OR CommandLine LIKE '%cscript%'")   
            AppPrevInstance = (.Count > 1)   
        End With   
    End With   
End Function  
' --------------------------------------
If AppPrevInstance() Then 
    MsgBox "There is an existing proceeding !" & VbCrLF &_
    CommandLineLike(WScript.ScriptName),VbExclamation,"There is an existing proceeding !"    
    WScript.Quit   
Else 
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\cimv2")
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _
    & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
    & "TargetInstance.GroupComponent= " _
    & "'Win32_Directory.Name=""d:\\\\scripts""'")

    Do
        Set objLatestEvent = colMonitoredEvents.NextEvent
        Call DoWithName(objLatestEvent.TargetInstance.PartComponent)
    Loop
End if
' --------------------------------------
Sub DoWithName( strPartComp)
    Dim Title,arrFileName,Question,ws
    Title = "Execute vbscript"
    set ws = CreateObject("wscript.shell")
    arrFileName = Split( strPartComp, """")
    If True Or UBound(arrFileName) > 0 Then
        Wscript.Echo strPartComp _
        & vbNewLine & UBound( arrFileName) _
        & vbNewLine & "[" & arrFileName( 0)  & "]" _
        & vbNewLine & "[" & arrFileName( 1)  & "]" _
        & vbNewLine & "[" & arrFileName( 2)  & "]" _
        & vbNewLine & DblQuote(ShowAbsolutePath(arrFileName(1)))
    End If
    Question = MsgBox("Did you want to execute this vbscript : " & DblQuote(ShowAbsolutePath(arrFileName(1))),vbYesNo+vbQuestion,Title)
    If Question = vbYes Then
        ws.run DblQuote(ShowAbsolutePath(arrFileName(1)))
    Else
    End if
End Sub
' --------------------------------------
Function ShowAbsolutePath( strPath)
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
    ShowAbsolutePath = fso.GetAbsolutePathName( strPath)
End Function
' --------------------------------------
Function DblQuote(Str)
    DblQuote = Chr(34) & Str & Chr(34)
End Function
' --------------------------------------
Function CommandLineLike(ProcessPath)   
    ProcessPath = Replace(ProcessPath, "\", "\\")   
    CommandLineLike = "'%" & ProcessPath & "%'"   
End Function
' --------------------------------------
Function AppPrevInstance()   
    With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")   
        With .ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE " & CommandLineLike(WScript.ScriptFullName) & _
            " AND CommandLine LIKE '%WScript%' OR CommandLine LIKE '%cscript%'")   
            AppPrevInstance = (.Count > 1)   
        End With   
    End With   
End Function  
' --------------------------------------