Копирование файловой папки - PullRequest
0 голосов
/ 10 августа 2009

Ниже приведен код 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 ]

1 голос
/ 10 августа 2009

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

Это ваш код:

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

просто вызывает методы FolderExists и CreateFolder в последовательности (CreateFolder всегда вызывается, потому что условие if TRUE оценивается как 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
0 голосов
/ 10 августа 2009

Когда вы говорите

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...