Копирование файловой папки

Ниже приведен код VBScript. Если файл / файлы или папка существуют, я получаю сообщение об ошибке "Файл уже существует".

  • Как это исправить?
  • Как создать папку, только если она не существует, и скопировать только те файлы, которые являются новыми или не существуют в исходном пути?
  • Как вставить имя пользователя (точка 1) после "Добро пожаловать" и в (пункт 3) вместо отмены пользователя?
  • Можно ли изменить кнопки на Копировать, Обновить, Отменить вместо Да, Нет, Отмена? (Пункт 2)

Код:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set wshShell = WScript.CreateObject( "WScript.Shell" )
strUserName = wshShell.ExpandEnvironmentStrings( "%USERNAME%" )
Message = "       Welcome to the AVG Update Module" & vbCR '1*
Message = Message & "       *****************************" & vbCR & vbCR
Message = Message & "        Click Yes to  Copy   Definition Files" & vbCR & vbCR
Message = Message & "                            OR  " & vbCR & vbCR
Message = Message & "        Click  No to Update  Definition Files." & vbCR & vbCR
Message = Message & "        Click  Cancel (ESC) to Exit." & vbCR & vbCR
X = MsgBox(Message, vbYesNoCancel, "AVG Update Module") '2*
'Yes Selected Script
If X = 6 then
    objFSO.FolderExists("E:\Updates")
    if TRUE then objFSO.CreateFolder ("E:\Updates")
    objFSO.CopyFile "c:\Docume~1\alluse~1\applic~1\avg8\update\download\*.*",
    "E:\Updates\" ,   OverwriteFiles
    MsgBox "Files Copied Succesfully.", vbInformation, "Copy Success"
End If
'No Selected Script
If X = 7 then
    objFSO.FolderExists("Updates")
    if TRUE then objFSO.CreateFolder("Updates")
    objFSO.CopyFile "E:\Updates\*.*", "Updates", OverwriteFiles
    Message =  "Files Updated Successfully."  & vbCR & vbCR
    Message = Message & "Click  OK to Launch AVG GUI." & vbCR & vbCR
    Message = Message & "Click  Cancel (ESC) to Exit." & vbCR & vbCR
    Y = MsgBox(Message, vbOKCancel, "Update Success")
    If Y = 1 then
        Set WshShell = CreateObject("WScript.Shell")
        WshShell.Run chr(34) & "C:\Progra~1\avg\avg8\avgui.exe" & Chr(34), 0
        Set WshShell = Nothing
    End if
    If Y = 3 then WScript.Quit
End IF
'Cancel Selection Script
If X = 2 then
    MsgBox "No Files have been Copied/Updated.", vbExclamation, "User Cancelled" '3*
End if

2 ответа

Как создать папку, только если она не существует

Это твой код:

objFSO.FolderExists("E:\Updates")
if TRUE then objFSO.CreateFolder ("E:\Updates")

просто называет FolderExists а также CreateFolder методы в последовательности (CreateFolder всегда называется, потому что if TRUE условие оценивается как Истина) и равно:

objFSO.FolderExists("E:\Updates")
objFSO.CreateFolder ("E:\Updates")

Вы хотите позвонить CreateFolder в зависимости от возвращаемого значения FolderExists метод:

If Not objFSO.FolderExists("E:\Updates") Then
   objFSO.CreateFolder "E:\Updates"

и копировать только те файлы, которые являются новыми или не существуют в исходном пути?

Ни VBScript, ни FileSystemObject Объект имеет эту функциональность. Тем не менее, можно вызвать внешний инструмент, который может сделать это, такой как xcopy из вашего скрипта, используя WshShell.Run метод. Я думаю, вам нужно что-то вроде этого:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "xcopy c:\Docume~1\alluse~1\applic~1\avg8\update\download\*.* E:\Updates\ /D", , True

Как вставить имя пользователя (пункт 1)

Объединить текст сообщения с strUserName значение переменной:

Message = "       Welcome " & strUserName & " to the AVG Update Module" & vbCR
...
MsgBox "No Files have been Copied/Updated.", vbExclamation, strUserName & " Cancelled"

Можно ли изменить кнопки на Копировать, Обновить, Отменить вместо Да, Нет, Отмена?(Пункт 2)

Нет, VBScript встроен MsgBox Функция не поддерживает пользовательские кнопки. Однако есть обходные пути: вы можете создать свое собственное окно сообщения, используя HTA (приложение HTML) или использовать InputBox функция для запроса пользователя о задаче, которую он хочет выполнить. Вы можете найти примеры здесь.


Я также хотел бы отметить, что вы можете улучшить свой сценарий, используя Select Case заявление, чтобы проверить MsgBox возвращаемое значение вместо нескольких If...Then...End If заявления. Также не рекомендуется использовать "магические числа", такие как 6 или 7, - вместо этого используйте соответствующие константы. Например:

Select Case X
  Case vbYes
     ...
  Case vbNo
     ...
  Case Else ' vbCancel
     ...
End Select

Когда ты сказал

msgstr "копировать только те файлы, которые являются новыми или не существуют в исходном пути?"

Вы имеете в виду, что хотите копировать файлы только из исходного каталога в каталог назначения, если они не существуют в месте назначения? Если это так, то это будет достигнуто

Const SourceFolder = "C:\Test1\"
Const DestinationFolder = "C:\Test2\"

Set fso = CreateObject("Scripting.FileSystemObject")
'Get a collection of al the files in the source directory
Set fileCol = fso.GetFolder(SourceFolder).Files

'Loop through each file and check to see if it exists in the destination directory
For Each objFile in fileCol
    If NOT fso.FileExists(DestinationFolder & objFile.Name) Then
        'If the file does not exist in the destination directory copy it there.
        objFile.Copy DestinationFolder
    Else
        If objFile.DateLastModified > fso.GetFile(DestinationFolder & objFile.Name).DateLastModified Then
            'If the file is newer than the destination file copy it there
            objFile.Copy DestinationFolder, True
        End If
    End If
Next 
Set fileCol = Nothing
Set fso = Nothing

Добавлена ​​запрошенная проверка даты.

Другие вопросы по тегам