VBscript создает массив, но пропускает пустые переменные - PullRequest
0 голосов
/ 31 августа 2018

Я хочу создать сценарий, который будет сравнивать дату последнего изменения (до 4 файлов) и затем записывать последний измененный файл. Моя текущая проблема в том, что некоторые файлы могут не существовать.

Набор потерпит неудачу, если файл не существует, но я легко могу преодолеть это, ища файл и, если он не существует, просто пропустите команду set. Это может привести к сбою создания массива, поскольку моя переменная теперь пуста. Любые предложения, как решить эту проблему?

Вот что у меня есть:

Option Explicit  
Dim objFSO, path, file, recentDate, recentFile, File1, File2, File3, File4, afiles, File1date, date1
Set objFSO = CreateObject("Scripting.FileSystemObject")
set File1=objFSO.getfile("c:\temp\file.txt")
set File2=objFSO.getfile("c:\test\File.txt")
set File3=objFSO.getfile("c:\users\%profile%\documents\File.txt")
set File4=objFSO.getfile("c:\users\public\documents\File.txt")

'Prepare variables to store the required information    
Dim dateMin, dateMax
date1 = File1.datelastmodified
wscript.echo date1
wscript.echo now
    dateMin = date1
    dateMax = date1

afiles = Array( File1.datelastmodified, File2.datelastmodified, File3.datelastmodified, File4.datelastmodified )

Dim i
    For i=1 to UBound(aFiles)
        If aFiles(i) < dateMin Then dateMin = aFiles(i)
        if aFiles(i) > dateMax Then dateMax = aFiles(i)
    Next 
'
' Output Information
   WScript.Echo "Highest: " & CStr( dateMax )
   WScript.Echo " Lowest: " & CStr( dateMin )

1 Ответ

0 голосов
/ 31 августа 2018

Я думаю, что было бы намного проще, если бы вы использовали ArrayList для захвата DateLastModified для каждого файла.
ArrayList позволяет динамически добавлять значения в отличие от массива VBScript. Кроме того, ArrayList имеет очень полезный метод, называемый Sort(), который мы можем использовать здесь для определения значений dateMin и dateMax.

Попробуйте:

Option Explicit

Dim objFSO, objList, objFile, arrFiles, fileName

arrFiles = Array("c:\temp\file.txt","c:\test\File.txt","c:\users\%profile%\documents\File.txt","c:\users\public\documents\File.txt")

Set objList = CreateObject("System.Collections.ArrayList")
Set objFSO = CreateObject("Scripting.FilesystemObject")

For Each fileName In arrFiles
    If objFSO.FileExists(fileName) Then
        Set objFile = objFSO.GetFile(fileName)
        objList.Add objFile.DateLastModified
    End If
Next
objList.Sort()

' Prepare variables to store the required information
Dim dateMin, dateMax
dateMin = objList.item(0)
dateMax = objList.item(objList.Count - 1)


' Output Information
WScript.Echo "Highest: " & CStr( dateMax )
WScript.Echo "Lowest:  " & CStr( dateMin )

' Clean up
Set objFSO = Nothing
Set objFile = Nothing
Set objList = Nothing

Редактировать

Приведенный выше код был римейком вашего исходного кода. Возможно, я неправильно понял, что ваша цель - найти файл, который был изменен последним.

Это должно сделать то, что вы имеете в виду:

Option Explicit

Dim objFSO, objFile, objLatest, fileName, arrFiles

arrFiles = Array("c:\temp\file.txt","c:\test\File.txt","c:\users\%profile%\documents\File.txt","c:\users\public\documents\File.txt")

Set objFSO  = CreateObject("Scripting.FilesystemObject")
Set objLatest = Nothing

For Each fileName In arrFiles
    If objFSO.FileExists(fileName) Then
        Set objFile = objFSO.GetFile(fileName)
        If (objLatest Is Nothing) Then
            Set objLatest = objFile
        ElseIf (objFile.DateLastModified > objLatest.DateLastModified) Then
            Set objLatest = objFile
        End If
    End If
Next

If objLatest Is Nothing Then
    WScript.Echo "None of the files in 'arrFiles' exist.."
Else
    ' Here you decide if you want to keep the latest file as Object (-> objLatest) or just as a string to the full pathname of that file
    Dim latestFile
    latestFile = objFSO.GetAbsolutePathName(objLatest)  ' store the full path and filename
    ' Info on FormatDateTime() at https://www.w3schools.com/asp/func_formatdatetime.asp
    WScript.Echo "Most recently modified file is '" & latestFile & "' at " & FormatDateTime(objLatest.DateLastModified, 0)
End If

' Clean up
Set objFSO = Nothing
Set objFile = Nothing
Set objLatest = Nothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...