求助:使用VBScript对比文件夹最新两文件并返回错误码
Got it, let's work through this since you're not a VBScript pro but need to build this tool using existing resources. Here's a practical, step-by-step solution that fits your two use cases:
First, let's clarify the two scenarios you need to handle:
- Regular 10-minute check: Compare the two most recent files in your target folder. Return a non-zero error code if they differ (signaling new data to process).
- Daily initial check: Compare the first new file of the day against a static reference file. Again, return a non-zero code if there's a difference.
We'll break this into reusable functions and a main logic block to handle both modes.
1. Function to Fetch Latest Files
This function sorts files in a folder by their last modified time (newest first) and returns the top N files you specify:
Function GetLatestFiles(folderPath, count) Dim fso, folder, files, file, sortedFiles(), i, j, temp Set fso = CreateObject("Scripting.FileSystemObject") Set folder = fso.GetFolder(folderPath) Set files = folder.Files ' Initialize array to store files ReDim sortedFiles(files.Count - 1) i = 0 For Each file In files Set sortedFiles(i) = file i = i + 1 Next ' Sort files by last modified date (descending order) For i = 0 To UBound(sortedFiles) - 1 For j = i + 1 To UBound(sortedFiles) If sortedFiles(i).DateLastModified < sortedFiles(j).DateLastModified Then Set temp = sortedFiles(i) Set sortedFiles(i) = sortedFiles(j) Set sortedFiles(j) = temp End If Next Next ' Return only the top N files requested If count > UBound(sortedFiles) + 1 Then count = UBound(sortedFiles) + 1 ReDim Preserve sortedFiles(count - 1) Set GetLatestFiles = sortedFiles End Function
2. Function to Compare Files
Instead of writing a byte-by-byte comparison from scratch, we'll use Windows built-in fc (file compare) command—it's reliable and handles large files reasonably well. We'll add a quick size check first to skip unnecessary deep comparisons:
Function FilesAreDifferent(filePath1, filePath2) Dim fso, file1, file2 Set fso = CreateObject("Scripting.FileSystemObject") Set file1 = fso.GetFile(filePath1) Set file2 = fso.GetFile(filePath2) ' Quick win: if file sizes differ, they're definitely not the same If file1.Size <> file2.Size Then FilesAreDifferent = True Exit Function End If ' If sizes match, run byte-level comparison with fc Dim shell, exec Set shell = CreateObject("WScript.Shell") Set exec = shell.Exec("fc /b """ & filePath1 & """ """ & filePath2 & """") exec.StdIn.Close ' Close input to prevent hanging Do While exec.Status = 0 WScript.Sleep 100 ' Wait for comparison to finish Loop ' fc returns 0 = identical, 1 = different, 2 = error FilesAreDifferent = (exec.ExitCode = 1) End Function
3. Main Logic to Handle Both Modes
We'll use a command-line argument to switch between "regular" and "daily" modes. Your calling program can pass this argument when running the script.
Dim folderPath, staticFilePath, mode, latestFiles, file1, file2, areDifferent ' --- CONFIGURE THESE VALUES FOR YOUR SYSTEM --- folderPath = "C:\Path\To\Your\File\Folder" staticFilePath = "C:\Path\To\Your\Static\ReferenceFile.txt" ' --------------------------------------------- ' Check if mode argument is provided If WScript.Arguments.Count = 0 Then WScript.Echo "Error: Please specify mode - 'regular' or 'daily'" WScript.Quit 3 ' Error code for missing mode End If mode = WScript.Arguments(0) Select Case mode Case "regular" ' Get the two newest files latestFiles = GetLatestFiles(folderPath, 2) If UBound(latestFiles) < 1 Then WScript.Echo "Error: Less than 2 files in target folder" WScript.Quit 2 ' Error code for insufficient files End If Set file1 = latestFiles(0) Set file2 = latestFiles(1) areDifferent = FilesAreDifferent(file1.Path, file2.Path) Case "daily" ' Get the newest file to compare against static reference latestFiles = GetLatestFiles(folderPath, 1) If UBound(latestFiles) < 0 Then WScript.Echo "Error: No files in target folder" WScript.Quit 2 End If Set file1 = latestFiles(0) areDifferent = FilesAreDifferent(file1.Path, staticFilePath) Case Else WScript.Echo "Error: Invalid mode. Use 'regular' or 'daily'" WScript.Quit 3 End Select ' Return error code to calling program: ' 0 = Files are identical, no new data ' 1 = Files differ, new data available ' 2 = Insufficient files to compare ' 3 = Invalid/missing mode argument If areDifferent Then WScript.Quit 1 Else WScript.Quit 0 End If
- Regular 10-minute check: Run the script with the
regularargument:cscript YourScriptName.vbs regular - Daily initial check: Run with the
dailyargument:cscript YourScriptName.vbs daily - Your calling program can read the script's exit code to act:
0: No differences, skip processing1: Differences detected, trigger data processing2/3: Handle errors (e.g., log missing files)
- Make sure the script has read access to the target folder and static file.
- For extremely large files, you might want to tweak the
fccommand or add additional checks (like comparing file hashes via a helper tool), but the size check +fccombo works for most use cases. - Test the script with sample files first to confirm it returns the correct error codes.
内容的提问来源于stack exchange,提问作者Brad S.

