VBScript для перемещения файла с подстановочным знаком, если он существует

Я пытаюсь создать сценарий, который проверяет наличие архивных файлов журнала событий и, если они существуют, перемещает их в другую папку. Запуск этого скрипта ничего не делает и не выдает ошибок. Я считаю, что подстановочный знак в выражении If вызывает у меня проблемы. Я новичок в vbscript и сценариях в целом, и был бы признателен за некоторые советы.

Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists("d:\eventlogs\Archive*.evtx")) Then
    FSO.CopyFile "d:\eventlogs\Archive*.evtx" , "d:\eventlogs\archive\"
    FSO.Deletefile "d:\eventlogs\archive*.evtx"
End if

person user3157550    schedule 03.01.2014    source источник
comment
Почему VBScript, когда DOS пакетные файлы могут сделать вышеперечисленное проще?   -  person Stephen Quan    schedule 03.01.2014


Ответы (3)


Вы можете воспроизвести поиск с подстановочными знаками, используя комбинацию instr() и right() или просто несколько instr().

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "d:\eventlogs\"

Set objFolder = objFSO.GetFolder(objStartFolder)

Set colFiles = objFolder.Files
For Each objFile in colFiles
   if instr(objFile.Name,"Archive") <> 0 AND instr(objFile.Name,".evtx") <> 0 then
       objFSO.MoveFile objFile.Name, "archive\" + objFile.Name
   end if
Next
person Ahmad El-Hoss    schedule 09.04.2015

Подходящий подход к поиску файлов с подстановочными знаками в VBScript:

  1. Получить коллекцию файлов из содержащей папки
  2. Для каждого файла в коллекции файлов:
  3. Проверьте имя файла с помощью регулярного выражения по определенному шаблону
  4. Если тест пройден, выполните какое-либо действие с этим файлом
  5. Следующий файл
person AutomatedChaos    schedule 03.01.2014
comment
В этом случае сравнение строк для расширения и начала имени файла может быть проще в обработке, чем регулярное выражение. - person Ansgar Wiechers; 04.01.2014

Поздний ответ, но может быть полезен, потому что, по-видимому, никто не заметил ошибку.

Из документации VBScript (script56.chm в моем случае) на странице справки для метода CopyFile говорится:

Метод FileExists

Возвращает True, если указанный файл существует; False, если это не так.

object.FileExists(filespec)

Аргументы

объект

Необходимый. Всегда имя FileSystemObject.

спецификация файла

Необходимый. Имя файла, существование которого необходимо определить. Полный путь (абсолютный или относительный) должен быть указан, если файл не должен существовать в текущей папке.

Следовательно, ваше выражение fso.FileExists("d:\eventlogs\Archive*.evtx") возвращает здесь False; действительно, в вашей папке нет файла с именем Archive*.evtx.

Либо вы удалите свой тест, но вам придется иметь дело с ошибкой, которую может сгенерировать метод CopyFile, как говорит документ:

Ошибка также возникает, если источник, использующий подстановочные знаки, не соответствует ни одному файлу.

Как было предложено @automatedchaos в его ответе https://stackoverflow.com/a/20907209/666414, вы также можете выполнить цикл файлы папки и решите, что делать, когда имя файла/расширение соответствует вашему шаблону.

Наконец, вы можете комбинировать оба решения: перебрать файлы в папке, затем установить флаг True и Exit Loop, как только вы обнаружите ожидаемый файл, а затем использовать метод CopyFile.

Так:

With CreateObject("Scripting.FileSystemObject")
    For Each objFile in .GetFolder("d:\eventlogs\").Files
        If Left(objFile.Name, 7) = "Archive" And .GetExtensionName(objFile) = "evtx" Then
            archiveFound = True
        End If
    Next

    If archiveFound Then
        .CopyFile "d:\eventlogs\Archive*.evtx", "d:\eventlogs\archive\"
        .DeleteFile "d:\eventlogs\Archive*.evtx"
    End If
End With

Обратите внимание, что подстановочные знаки работают и с методом DeleteFile!

person maxxyme    schedule 02.07.2019