vbscript:不断检查文件是否存在并显示生命周期

时间:2014-04-10 11:43:17

标签: file vbscript

我对我的代码提出了一个非常具体的问题。

所以我有一个文件夹。在此文件夹中可以有> = 0个文件。 我的第一个脚本在后台运行,检查文件计数是否> 0。 一旦它> 0,它就会激活带有路径+文件名的第二个脚本,并且一旦激活 从文件夹中删除/删除文件,它会显示文件的生命周期。

一切正常,但有一个问题: 如果文件夹中有多个文件同时存在,那么只有观察者"最上面的一个(文件名,升序)。因此,如果第一个被删除,它肯定会观察到第二个,但是生命周期是错误的,因为它在第一个被删除之前没有开始。

以下是我的两个代码:

Script1.vbs:

Set fso =CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count = 1 Then
    pfadTiff0 = CStr(WScript.Arguments(0))
Else
    msgbox "Bitte Argumente (Pfade) angeben"
    WScript.Quit
End If

While True
    Set ordnerTiff0 = fso.GetFolder(pfadTiff0)
    Set filesTiff0 = ordnerTiff0.Files
    anzFilesTiff0 = ordnerTiff0.Files.Count
    If anzFilesTiff0 > 0 Then
        For Each objFile in filesTiff0  
            CreateObject("WScript.Shell").Run "QueueTimeUP.vbs " & objFile.Name & " " & pfadTiff0, 0, True                                      
        Next
    End If
    WScript.Sleep 2000
WEnd

Script2.vbs:

filename = CStr(WScript.Arguments(0))
pfad = CStr(WScript.Arguments(1))
Set fso = CreateObject("Scripting.FileSystemObject")

startZeit = Timer()
komplett = pfad&"\"&filename

While fso.FileExists(komplett) = True
    WScript.Sleep 100
WEnd

endZeit = Timer()
differenz = endZeit-startZeit
msgbox "Existenz von Job " & filename & " in Sekunden: " & differenz

3 个答案:

答案 0 :(得分:2)

感谢您的帮助。

@Bond:删除while true循环是没有选择的,因为程序不允许停止运行。即使此时没有文件,以后也总会有新文件也必须被观察到。但是您对Run-Statement的“false”参数的提示很棒!

@ Rob1991: 好主意,这是我提出问题之前的第一个想法。

我自己想出了一个不同的解决方案。也许它可以帮助任何人:

Set fso =CreateObject("Scripting.FileSystemObject") 
If WScript.Arguments.Count = 1 Then
    pfadTiff0 = CStr(WScript.Arguments(0))
Else
    msgbox "Bitte Argumente (Pfade) angeben"
    WScript.Quit
End If

Set ordnerTiff0 = fso.GetFolder(pfadTiff0
Set filesTiff0 = ordnerTiff0.Files

letztesFile = "000a"    // PART OF SOLUTION, IT´S "LAST FILE"

While True
    For Each objFile in filesTiff0
        If objFile.Name > letztesFile Then   // PART OF SOLUTION
            CreateObject("WScript.Shell").Run "QueueTimeUP.vbs " & objFile.Name & " " & pfadTiff0, 0, False  // thanks Bond for "false"
            letztesFile = objFile.Name      // PART OF SOLUTION
        End If      
    Next                                        
    WScript.Sleep 500
WEnd

答案 1 :(得分:1)

本声明:

CreateObject("WScript.Shell").Run "QueueTimeUP.vbs " & objFile.Name & " " & pfadTiff0, 0, True

使用值True作为最后一个参数。这指定您要等到脚本在返回之前完成(同步)。因此,您的主脚本将处于等待状态,直到您的第二个脚本(QueueTimeUp.vbs)退出,这在第一个文件被删除之前不会发生。

您应该能够使用False作为最后一个参数,它不会等待第二个脚本完成。然后删除While True循环,只需完成主脚本。

' Main script. Remove "While True" loop.
Set ordnerTiff0 = fso.GetFolder(pfadTiff0)
Set filesTiff0 = ordnerTiff0.Files
anzFilesTiff0 = ordnerTiff0.Files.Count
If anzFilesTiff0 > 0 Then
    For Each objFile in filesTiff0  

        ' Use False for last param to specify asynchronous call...
        CreateObject("WScript.Shell").Run "QueueTimeUP.vbs " & objFile.Name & " " & pfadTiff0, 0, False

    Next
End If

' Allow script to complete.

现在,您将为文件夹中的每个文件运行QueueTimeUp.vbs脚本。

仅供参考:如果您熟悉通过VBScript编写WMI脚本,它会提供__InstanceCreationEvent__InstanceDeletionEvent类,它们可以分别在创建或删除文件时通知您的脚本。然后,您不必每隔几秒就轮询一个文件夹来查找更改。

答案 2 :(得分:0)

我相信每个文件都会加载vbs2,但是在vbs2结束之前不会开始下一次执行。如果我使用下面的代码,它将不会迭代,直到cmd的实例结束

For Each objFile in colFiles
     oShell.run "cmd /k CD C:\Program File" ,1 , true
Next

我想你想在你的第一个vbs中有一个启动计时器,然后将它传递给第二个vbs2。这意味着开始时间仅在程序执行开始时调用一次

startZeit = Timer() 

For Each objFile in filesTiff0 
     CreateObject("WScript.Shell").Run "QueueTimeUP.vbs " & objFile.Name & " " & pfadTiff0 & " " & startZeit , 0, True                                      
Next

vbs 2

startZeit = CStr(WScript.Arguments(2))

希望这有帮助