我收到了一个关于我的代码的非常具体的问题。
所以我有一个文件夹。在这个文件夹中可以有>=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
谢谢你们的帮助。
@Bond:删除while true循环是不可选择的,因为程序不允许停止运行。即使此时没有文件,以后也会有新的文件,这些文件也必须遵守。但是您在Run语句中使用"false"参数的提示非常棒!
@1991年6月:好主意,这实际上是我提出问题之前的第一个想法。
我自己想出了一个不同的解决方案。也许它对任何人都有帮助:
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
此语句:
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
类,它们可以分别在创建或删除文件时通知您的脚本。这样,您就不必每隔几秒钟轮询一次文件夹以查找更改。
我相信它会为每个文件加载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))
希望这能帮助