2016-02-17 3 views
0

Я никогда на самом деле написан в VBS (когда-то написали сценарий, который будет приветствовать меня на ботинке), но я после того, как сценарий, по существу выполнить:Рекурсивные синхронизации папки с помощью VBScript (Зеркало папки)

robocopy "folder1" "folder2" /MIR 

на данный момент, что я получил это скопировали сценарий здесь VBS Mirror, используя верхний скрипт:

This code synchronizes the contents (files and subfolders) of two folders. Each folder is traversed recursively and any missing subfolders and files are copied both ways. If corresponding folders contain files with matching file names but with different time stamps, the file with the newest time stamp will overwrite the older.

SyncFolders.vbs

Option Explicit 
ForceScriptEngine("cscript") 

Dim wshArgs 
Set wshArgs = Wscript.Arguments 
If WshArgs.Count = 2 Then 
    Call SyncFolders(WshArgs.Item(0), WshArgs.Item(1)) 
    ' Also run once in reverse to catch mismatching subfolder count: 
    Call SyncFolders(WshArgs.Item(1), WshArgs.Item(0)) 
Else 
    Wscript.Echo("Wrong number of arguments. Syntax: SyncFolders Folder1 Folder2") 
    Wscript.Sleep(3000) ' To allow Function syntax popup message to be seen. 
End If 

Sub SyncFolders(strFolder1, strFolder2) 
    Dim objFileSys 
    Dim objFolder1 
    Dim objFolder2 
    Dim objFile1 
    Dim objFile2 
    Dim objSubFolder 
    Dim arrFolders 
    Dim i 
    Set objFileSys = CreateObject("Scripting.FileSystemObject") 
    arrFolders = Array(strFolder1, strFolder2) 
    For i = 0 To 1 ' Make sure that missing folders are created first: 
    If objFileSys.FolderExists(arrFolders(i)) = False Then 
     wscript.echo("Creating folder " & arrFolders(i)) 
     objFileSys.CreateFolder(arrFolders(i)) 
    End If 
    Next 
    Set objFolder1 = objFileSys.GetFolder(strFolder1) 
    Set objFolder2 = objFileSys.GetFolder(strFolder2) 
    For i = 0 To 1 
    If i = 1 Then ' Reverse direction of file compare in second run 
     Set objFolder1 = objFileSys.GetFolder(strFolder2) 
     Set objFolder2 = objFileSys.GetFolder(strFolder1) 
    End If 
    For Each objFile1 in objFolder1.files 
     If Not objFileSys.FileExists(objFolder2 & "\" & objFile1.name) Then 
     Wscript.Echo("Copying " & objFolder1 & "\" & objFile1.name & _ 
      " to " & objFolder2 & "\" & objFile1.name) 
     objFileSys.CopyFile objFolder1 & "\" & objFile1.name, _ 
      objFolder2 & "\" & objFile1.name 
     Else 
     Set objFile2 = objFileSys.GetFile(objFolder2 & "\" & objFile1.name) 
     If objFile1.DateLastModified > objFile2.DateLastModified Then 
      Wscript.Echo("Overwriting " & objFolder2 & "\" & objFile1.name & _ 
      " with " & objFolder1 & "\" & objFile1.name) 
      objFileSys.CopyFile objFolder1 & "\" & objFile1.name, _ 
      objFolder2 & "\" & objFile1.name  
     End If 
     End If 
    Next 
    Next 
    For Each objSubFolder in objFolder1.subFolders 
    Call SyncFolders(strFolder1 & "\" & objSubFolder.name, strFolder2 & _ 
     "\" & objSubFolder.name) 
    Next 
    Set objFileSys = Nothing 
End Sub 

Sub ForceScriptEngine(strScriptEng) 
    ' Forces this script to be run under the desired scripting host. 
    ' Valid arguments are "wscript" or "cscript". 
    ' The command line arguments are passed on to the new call. 
    Dim arrArgs 
    Dim strArgs 
    For Each arrArgs In WScript.Arguments 
    strArgs = strArgs & " " & Chr(34) & arrArgs & Chr(34) 
    Next 
    If Lcase(Right(Wscript.FullName, 12)) = "\wscript.exe" Then 
    If Instr(1, Wscript.FullName, strScriptEng, 1) = 0 Then 
     CreateObject("Wscript.Shell").Run "cscript.exe //Nologo " & _ 
     Chr(34) & Wscript.ScriptFullName & Chr(34) & strArgs 
     Wscript.Quit 
    End If 
    Else 
    If Instr(1, Wscript.FullName, strScriptEng, 1) = 0 Then 
     CreateObject("Wscript.Shell").Run "wscript.exe " & Chr(34) & _ 
     Wscript.ScriptFullName & Chr(34) & strArgs 
     Wscript.Quit 
    End If 
    End If 
End Sub 

Я изменил:

Sub SyncFolders(strFolder1, strFolder2) 

в

Sub SyncFolders(strC:\Users\Zac\Desktop\Folder, strW:\Folder) 

и получить ошибку «ожидаемый ')'

Я уверен, что это что-то совершенно очевидно, но может кто-то скажите, пожалуйста, что мне нужно изменить в этом скрипте, чтобы мои папки отражали друг друга?

+0

Я Мне жаль, но я все еще не слишком уверен, что я должен здесь делать. Я изменил «strFolder1» и «strFolder2» на мои каталоги почти в каждой комбинации, о которой я могу думать, но все же получаю ошибку? Какие из них мне нужно изменить, чтобы он работал? –

+0

Вы должны вызвать субпоток таким образом ==> Вызовите SyncFolders («C: \ Users \ Zac \ Desktop \ Folder», «W: \ Folder») – Hackoo

+0

Проблема здесь в том, что вы изменили «Sub SyncFolders» (strFolder1, strFolder2) 'определение неверного синтаксиса. Лично вам сначала нужно научиться писать и структурировать VBScript, прежде чем пытаться использовать такие сценарии. Скрипт сам по себе, вам просто нужно вызвать его и передать ожидаемые аргументы. – Lankymart

ответ

2

Поскольку это vbscript-сила для работы с движком Cscript; Вы должны выполнить его с помощью Litlle партии, как таким образом:

@echo off 
Cscript /nologo SyncFolders.vbs "C:\Users\Zac\Desktop\Folder" "W:\Folder" 
pause 

Edit: И если вы хотите, чтобы избежать этой партии и используя двигатель CSCRIPT, попробуйте следующее:

Option Explicit 
'You must only change the absolute paths of the two folders here 
Call SyncFolders("C:\Users\Zac\Desktop\Folder","W:\Folder") 
'**********************Don't Change nothing below this line ***************************** 
Sub SyncFolders(strFolder1, strFolder2) 
    Dim objFileSys 
    Dim objFolder1 
    Dim objFolder2 
    Dim objFile1 
    Dim objFile2 
    Dim objSubFolder 
    Dim arrFolders 
    Dim i 
    Set objFileSys = CreateObject("Scripting.FileSystemObject") 
    arrFolders = Array(strFolder1, strFolder2) 
    For i = 0 To 1 ' Make sure that missing folders are created first: 
    If objFileSys.FolderExists(arrFolders(i)) = False Then 
     'wscript.echo("Creating folder " & arrFolders(i)) 
     objFileSys.CreateFolder(arrFolders(i)) 
    End If 
    Next 
    Set objFolder1 = objFileSys.GetFolder(strFolder1) 
    Set objFolder2 = objFileSys.GetFolder(strFolder2) 
    For i = 0 To 1 
    If i = 1 Then ' Reverse direction of file compare in second run 
     Set objFolder1 = objFileSys.GetFolder(strFolder2) 
     Set objFolder2 = objFileSys.GetFolder(strFolder1) 
    End If 
    For Each objFile1 in objFolder1.files 
     If Not objFileSys.FileExists(objFolder2 & "\" & objFile1.name) Then 
     'Wscript.Echo("Copying " & objFolder1 & "\" & objFile1.name & _ 
     ' " to " & objFolder2 & "\" & objFile1.name) 
     objFileSys.CopyFile objFolder1 & "\" & objFile1.name, _ 
      objFolder2 & "\" & objFile1.name 
     Else 
     Set objFile2 = objFileSys.GetFile(objFolder2 & "\" & objFile1.name) 
     If objFile1.DateLastModified > objFile2.DateLastModified Then 
      'Wscript.Echo("Overwriting " & objFolder2 & "\" & objFile1.name & _ 
      ' " with " & objFolder1 & "\" & objFile1.name) 
      objFileSys.CopyFile objFolder1 & "\" & objFile1.name, _ 
      objFolder2 & "\" & objFile1.name  
     End If 
     End If 
    Next 
    Next 
    For Each objSubFolder in objFolder1.subFolders 
    Call SyncFolders(strFolder1 & "\" & objSubFolder.name, strFolder2 & _ 
     "\" & objSubFolder.name) 
    Next 
    Set objFileSys = Nothing 
End Sub 
'******************************************************************************** 
+0

Итак, я использовал командный файл, все еще получая ожидаемую ')' ошибку, я запустил ее без командного файла, получил ту же ошибку, сообщение об ошибке; Линия: 15 Char: 18 Ошибка: Ожидаемая ')' –

+0

@ZacharyWight Проверить последнее изменение: – Hackoo

+0

HAHA, он работает, спасибо, еще один вопрос: как остановить диалоговое окно, я планирую при наличии этого автозапуска всякий раз, когда диск «W: \» подключен и не хочет никакого взаимодействия с ним. –