【问题标题】:vbscript: Constantly check if file(s) exists and display life-timevbscript:不断检查文件是否存在并显示生命周期
【发布时间】:2014-05-24 02:25:17
【问题描述】:

我有一个关于我的代码的非常具体的问题。

所以我得到了一个文件夹。在此文件夹中可以有 >=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

【问题讨论】:

    标签: file vbscript


    【解决方案1】:

    感谢你们的帮助。

    @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
    

    【讨论】:

      【解决方案2】:

      此声明:

      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 类,可以分别在创建或删除文件时通知您的脚本。这样您就不必每隔几秒钟轮询一个文件夹以查找更改。

      【讨论】:

        【解决方案3】:

        我相信它会为每个文件加载 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))
        

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 2013-08-14
          • 2012-12-08
          • 2011-10-09
          • 2020-03-25
          • 1970-01-01
          • 2019-11-10
          • 2013-04-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多