2014-01-14 66 views
0

我使用下面的代碼:我是否需要等待設置新文件夾vbs?

Set StorageFileSystem = CreateObject("Scripting.fileSystemObject") 
Set StorageFolder = StorageFileSystem.GetFolder(PathToStorageFiles) 
msgBox "Set folders for Storage" 
for each Storagefile in StorageFolder.Files  'get the creation time of the oldest recording 
msgBox "DateCreated: " & Storagefile.DateCreated & vbCrLf & "EarylDateTime: " & earlyDateTime & vbCrLf & "DateTime to compare: " & dateadd("h" ,-6, Now) 
    if Storagefile.DateCreated < dateadd("h" ,-6, Now) then 
     earlyDateTime = Storagefile.DateCreated 
end if 
next 

我已經在此之前使用沒有問題,甚至在節目中,這是在不過這一次它似乎永遠不會做任何事情。該文件夾中有超過130,000個文件(391GB)。我不知道是否應該包含延遲,以便程序可以將它們枚舉出來,或者如果還有其他一些我沒有看到的問題。 任何想法?我正在使用VBS,在兩個set語句和for循環之間使用msgBox,但for循環和if語句的打開之間沒有。

+0

什麼是'PathToStorageFiles'的價值?對於StorageFolder.Files中的每個f:WScript.Echo f.Name:Next'是否列出這些文件?注意:用'cscript.exe'運行腳本,否則你必須確認130,000個彈出消息。出於同樣的原因,我強烈建議刪除循環中的MsgBox。 –

+0

PathToStorageFiles是放置文件的服務器的文件路徑。我的邏輯中確實發現了一些缺陷,所以我不再使用上述代碼。我會在一分鐘內發佈我的工作。 – Mike

回答

0

這是我工作的代碼:

Option Explicit 
Dim LocalStorage, NewLocalStorage, recentFile, objFSO, colFiles, objFolder, file, OldestDate, strOldestDate, fso, ts, objFile 
LocalStorage = "D:\BlueIris\Storage" 
NewLocalStorage = "D:\BlueIris\New" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFSO.GetFolder(NewLocalStorage) 
Set colFiles = objFolder.Files 
For Each file in colFiles 
    If recentFile = "" Then 
    recentFile = file.DateCreated 
    ElseIf file.DateCreated > recentFile Then 
    recentFile = file.DateCreated 
    End If 
Next 
Set objFolder = objFSO.GetFolder(LocalStorage) 
Set colFiles = objFolder.Files 
OldestDate = Now 

For Each objFile in colFiles 
    if objFile.DateCreated < OldestDate Then 
     OldestDate = objFile.DateCreated 
     strOldestDate = objFile.DateCreated 
    End if 
Next 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set ts = fso.CreateTextFile ("C:\DVRInfo.txt", true) 
ts.writeline recentFile 
ts.writeline strOldestDate 
ts.close 

我實際的服務器上運行,這使得它運行了很多比原來的代碼,我試圖更快。請讓我知道,如果你仍然有這個缺陷,我希望儘可能高效。

感謝

編輯: 新代碼:

Option Explicit 
Dim LocalStorage, NewLocalStorage, recentFile, objFSO, colFiles, objFolder, file, OldestDate, strOldestDate, fso, ts, objFile 
LocalStorage = "D:\BlueIris\Storage" 
NewLocalStorage = "D:\BlueIris\New" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFSO.GetFolder(NewLocalStorage) 
Set colFiles = objFolder.Files 
Set recentFile = 0 
For Each file in colFiles 
    If file.DateCreated > recentFile Then 
    recentFile = file.DateCreated 
    End If 
Next 
Set objFolder = objFSO.GetFolder(LocalStorage) 
Set colFiles = objFolder.Files 
OldestDate = Now 
For Each objFile in colFiles 
    if objFile.DateCreated < OldestDate Then 
     OldestDate = objFile.DateCreated 
     strOldestDate = objFile.DateCreated 
    End if 
Next 
Set ts = fso.CreateTextFile ("C:\DVRInfo.txt", true) 
ts.writeline recentFile 
ts.writeline strOldestDate 
ts.close 
+0

你可以做的改進。查看我的答案更新部分。 – PatricK

+0

將'ts.writeline strOldestDate'更改爲'ts.writeline OldestDate',並刪除'strOldestDate = objFile.DateCreated',很好。您也可以在第二個目標上放置等待命令,直到第一個目標寫入文件。 – PatricK

+0

這是一個好主意,我甚至沒有注意到兩個不同的變量做同樣的事情。這是別人的代碼,沒有工作,我離開公司時需要修復它。感謝你的幫助。 – Mike

1

你是說For循環中的代碼似乎不工作?如果文件夾中沒有任何文件,它似乎不起作用。因此請檢查PathToStorageFiles的值。

您的最早的錄製創建時間的邏輯有缺陷 - 任何時間在Now之前6小時都被視爲最早並設置爲earlyDateTime。

試試這個代碼的下方,與樣本輸出:

PathToStorageFiles = "C:\Test" ' <=- Change this! 
Set StorageFileSystem = CreateObject("Scripting.fileSystemObject") 
Set StorageFolder = StorageFileSystem.GetFolder(PathToStorageFiles) 
sOldestFile = "" ' Stores the full name of the file 
earlyDateTime = dateadd("h" ,-6, Now) ' Assuming 6 hours before script started is oldest (it can be just Now) 
wscript.echo StorageFolder.Files.Count & " files in the folder " & PathToStorageFiles 
for each Storagefile in StorageFolder.Files  'get the creation time of the oldest recording 
    if Storagefile.DateCreated < earlyDateTime then 
     sOldestFile = Storagefile.Path 
     earlyDateTime = Storagefile.DateCreated 
     wscript.echo "earlyDateTime changed to " & earlyDateTime & " | " & sOldestFile 
    end if 
next 
wscript.echo vbCrLf & "Oldest file: " & sOldestFile & vbCrLf & "Created on: " & earlyDateTime 

cscript Output

在一個側面說明,您應該修改這個處理子文件夾太多,然後將文件移動到文件夾中。單個文件夾中的130,000個文件是一團糟!


UPDATE

根據您發佈的解決方案,也有改進,你可以做。

首先,使用1個FileSystemObject。

然後在for循環中輸入recentFile。您應該先將其設置爲零,而不是2個比較。話雖如此,你有機會分辨這些差異。

recentFile = 0 
For Each file in colFiles 
    If file.DateCreated > recentFile Then 
    recentFile = file.DateCreated 
    End If 
Next 

最後,如果d:在服務器是NAS,那麼你可以將代碼分成兩個部分 - 爲最古老的一個搜索最近的,其他的。然後使用批處理文件start cscript.exe //nologo <script#.vbs>方法在兩個進程中啓動它們。這需要2個txt文件才能輸出。

如果只有1個文件夾才能獲取最新的&最舊的文件,則它可以位於1 for循環中。

+0

我同意在單個文件夾中有很多文件是一團糟,但不是由我來決定是否應該排序。我確實注意到我的邏輯存在缺陷,而且這需要很長時間。我確實找到了一種方法來做到這一點,我將在一分鐘內將它作爲答案發布。 – Mike

+0

好吧,我不能使用兩個不同的文本文件輸出我需要它只有一個輸出(我在另一個程序中使用它)。不過,我嘗試更改一些代碼,現在是這樣: – Mike

+0

將代碼添加到原始帖子。 – Mike

相關問題