Преобразование пакета Robocopy в сценарий VB

Я пытаюсь преобразовать BATCH-файл, над которым все еще работаю (вопрос в Robocopy | Зеркальное отображение, включая исходную родительскую папку).

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

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

Dim Command1

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0, "Example", 1, "c:\Programs")
If objFolder Is Nothing Then
    Wscript.Quit
End If
wscript.Echo "folder: " & objFolder.title & " Path: " & objFolder.self.path

sCmd = "%windir%\System32\Robocopy.exe "
sDate = Day(Now) & "-" & Month(Now) & "-" & Year(Now)
sTime = Hour(Now) & "-" & Minute(Now) & "-" & Second(Now)
sSource = objFolder & " "
sDestination = "Backups\"& Year(Now) &"\"& Month(Now) &"\"& Day(Now) &"\ "
sLogDir = "Backups\Logs\"& Year(Now) &"\"& Month(Now) &"\"& Day(Now) &"\ "
sSwitches = "/SEC /E /Log:"& sTime &".txt"

Set objShell = CreateObject("Wscript.Shell")
objShell.Run(sCmd & sSource & sDestination & sSwitches)

Моя проблема в том, что это происходит в соответствии с файлом журнала;

Source = G:\test\delete\
Dest = G:\test\Backups\2013\10\23\

Между тем истинный источник;

C:\Users\User\Desktop\delete

Итак, что я хотел бы попытаться выяснить, так это то, почему он прикрепляет «G: \ test», папку, из которой запускается .vbs, к его источнику.

В общем, моя цель - просто скопировать файлы Robocopy, но источник основан на вводе пользователем (отсюда и опция выбора папки). Я также хотел бы добавить параметр «назначение», в котором вы указываете, куда делать резервную копию ... Но это действительно необязательно, я уверен, что смогу понять это, если разберусь с этой первой проблемой.

Заранее спасибо за любую помощь!


person Deadmano    schedule 23.10.2013    source источник
comment
Возможно sSource = objFolder.self.Path & " "   -  person MC ND    schedule 23.10.2013
comment
Спасибо, вы звезда!!! Однако кажется, что он работает только с папками, в которых нет пробелов... :( Если у меня есть имя папки с пробелами, например, Big Pictures или что-то в этом роде, он просто ничего не делает.   -  person Deadmano    schedule 23.10.2013
comment
Прости. sSource = Chr(34) & objFolder.self.Path & Chr(34) & " " . При вызове robocopy, если исходный код содержит пробелы, необходимо заключать пути в кавычки.   -  person MC ND    schedule 23.10.2013
comment
Это, в очередной раз, сработало как шарм! Мне серьезно нужно изучить и выяснить эти вещи, хотя, к чести, я действительно пробовал изначально двойные кавычки и читал о Chr (34), чтобы отменить это. :) Теперь, если я могу просто понять, почему под Windows 8 при попытке скопировать любой файл он получает отказ в доступе? UAC не включен, Win8 делает какие-то странные вещи со сценариями? Или мне нужно что-то добавить, чтобы убедиться, что он работает правильно, поскольку в контекстном меню нет пункта «Запуск от имени администратора». :(   -  person Deadmano    schedule 23.10.2013
comment
Вы должны выяснить, что дает вам отказ в доступе. Это может быть чтение исходного файла, запись файла назначения, изменение контроля доступа (вы используете /SEC), запись файла журнала, ...   -  person MC ND    schedule 23.10.2013
comment
Спасибо за это, это было из-за переключателя /SEC. :) Теперь все отсортировано, и я понял, как выполнить поиск папки для резервного копирования и поиск места для резервного копирования, ура! :D Теперь единственная проблема, с которой у меня возникли проблемы при преобразовании, это то, куда помещается папка Logs... Я хочу, чтобы она находилась в корне, где они выбирают место назначения резервного копирования в Backup Logs/HH:MM:SS.txt, однако я просто не могу заставить его работать... Вот эта строка: sSwitches = "/E /Log:"& Chr(34) & objDest.self.Path & Chr(34) & sTime &".txt" в зависимости от пункта назначения; sDestination = Chr(34) & objDest.self.Path & Chr(34) & " "   -  person Deadmano    schedule 23.10.2013
comment
кавычки ( chr(34) ) должны заключать полный путь, включая имя файла, а не только каталог, в котором вы размещаете журнал.   -  person MC ND    schedule 23.10.2013


Ответы (1)


Ну, если это сэкономит вам время...

Графический интерфейс RoboCopy существует.

http://technet.microsoft.com/en-us/magazine/2006.11.utilityspotlight.aspx

Это простое использование VB Script.

См. это, чтобы предложить пользователю выбрать папку. VBScript, чтобы открыть диалоговое окно для выбора пути к файлу

Как только вы получите представление о том, как использовать код, рекомендованный другим пользователем по этой ссылке. Краткое введение в мое безумие ... Подскажите папку, которую вы хотите сохранить, и выложите ее в пакет под названием Input, затем снова подскажите, куда сохранить резервную копию. Затем вызовите этот пакетный файл следующим образом:

Call input.bat

Перед вашими строками RoboCopy.

Итак, давайте определим, как использовать код vb.

'Open Windows Shell Script object
    Set wShell=CreateObject("WScript.Shell")
'Executes the MS HTML Application exe to leverage capabilities to select a file.
    Set iExec=wShell.Exec("mshta.exe ""about:<input type=file id=FILE><script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""")
'Sets First Prompt for source reference
    srcepath = iExec.StdOut.ReadLine
    Set oExec=wShell.Exec("mshta.exe ""about:<input type=file id=FILE><script>FILE.click();new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);</script>""")
'Sets Second Prompt for destination reference
    destpath = oExec.StdOut.ReadLine
    Set wShell=Nothing

Простые настройки VBS для сохранения input.bat из подсказки.

'This will open the new bat file as txt and write.
    const forwriting = 2
    set fso = CreateObject("Scripting.FileSystemObject")
    set output = fso.OpenTextFile("input.bat", ForWriting, True)
    output.writeline "set srcepath=" & srcepath
    output.writeline "set destpath=" & destpath

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

person Steve Kline    schedule 25.10.2014