4

好吧,这是我的问题。 我正在做一个logonscript,基本上从服务器路径将Microsoft Word模板复制到每台计算机的本地路径。这是通过检查组成员身份来完成的。Vbscript - 创建一个镜像多组文件夹的脚本

If MemberOf(ObjGroupDict, "g_group1") Then 
    oShell.Run "%comspec% /c %LOGONSERVER%\SYSVOL\mydomain.com\scripts\ROBOCOPY \\server\Templates\Group1\OFFICE2003\ " & TemplateFolder & "\" & " * /E /XO", 0, True 
End If 

此前我使用了robocopy的/ MIR开关,它非常优秀。 但是,如果用户是多个组的成员,则/ MIR开关会从第一个组中删除内容,因为它正在镜像来自第二个组的内容。意思是,我不能同时拥有两个内容。

这是“解决”不使用/ MIR开关,只是让内容被复制。 但是,在服务器上使用模板的全部想法是,我可以控制用户通过脚本接收的内容。所以如果我从服务器路径中删除一个文件或文件夹,这不会在本地计算机上复制。因为我不再使用/ MIR开关。 Comprende?

那么,我该怎么办? 我做了一个小脚本,基本上检查文件夹和文件,然后相应地删除它们,但实际上这最终与/ MIR开关的功能相同。我该如何解决这个问题?

编辑:我发现我真正需要的是一个例程,它扫描我的本地模板文件夹中的文件和文件夹,并检查是否在任何源模板文件夹中存在相同的结构。

的服务器模板文件夹设置这样的:

\\fileserver\templates\group1\ 
\\fileserver\templates\group2\ 
\\fileserver\templates\group3\ 
\\fileserver\templates\group4\ 
\\fileserver\templates\group5\ 
\\fileserver\templates\group6\ 

这确实复制是这样的(伪)结构的脚本:

If User is MemberOf (group1) Then 
    RoboCopy.exe \\fileserver\templates\group1\ c:\templates\workgroup *.* /E /XO 
End if 

If User is MemberOf (group2) Then 
    RoboCopy.exe \\fileserver\templates\group2\ c:\templates\workgroup *.* /E /XO 
End if 

If User is MemberOf (group3) Then 
    RoboCopy.exe \\fileserver\templates\group3\ c:\templates\workgroup *.* /E /XO 
End if 

等等等等 随着/ E切换,我确定它也复制子文件夹。而/ XO开关只复制比我本地路径中的文件和文件夹更新的文件和文件夹。 但它不考虑本地路径是否包含服务器模板路径中不存在的文件或文件夹。

因此,复制完成后,我想检查我的c:\ templates \ workgroup中的任何文件或文件夹是否实际存在于任何一个源中。如果他们不这样做,请从我的本地路径中删除它们。可能会在这些成员中加入某些东西?

+0

您对此有何看法?除非您为多个组的用户设置特殊模板路径,否则您需要每个组合的路径。每个组将总是覆盖前一组,您可能需要更复杂的解决方案。 – Tester101 2010-05-21 14:28:00

+0

如果您完全清除用户模板目录,然后将每个组模板复制到那里位置,该怎么办?这可能需要更多的时间,因为您每次都做一个完整的副本,但至少您会始终拥有正确的文件。 – Tester101 2010-05-21 14:32:39

+0

嗨,后者是我今天实际使用的方法,需要更新:)我需要一个更复杂的解决方案。这基本上就是我现在的想法。 – 2010-05-24 17:24:21

回答

2

使用查找表

我建议把所有的模板整合为一个通用文件服务器目录的方法,并使用查找表来分配模板组。

好处是您的模板可以保证同步;即您不必担心组A,B和C的模板在文件服务器上的所有组特定文件夹中都是相同的。

另一个好处是可维护的配置表,它允许您将模板分配给组,而无需更改登录脚本。

查找表的配置文件看起来像

group1;\templateA.dot;\templateA.dot 
group2;\B\templateB.dot;\B\templateB.dot 
group3;\B\C\templateC.dot;\templateC.dot 

与第1栏列出你的AD组名;第2列是源路径,第3列是目标路径。 这也可以让你的客户端模板文件夹扁平化。

在任何情况下,您都可以避免在文件服务器上维护所有模板的多个副本,并且添加更多的组或模板不需要触摸登录脚本,而只需要配置文件。

在您的登录脚本,您可以遍历所有线路,并与匹配组

登录脚本代码

open lookup table config file 

For Each line In lookup table 
    If MemberOf(ObjGroupDict, groupname_column_value) Then 
     execute Robocopy templatename_column_value local_target 
    End If 
Next 
+0

是的,这些都不是我正在寻找的东西。我目前正在使用Robocopy,我会继续这样做。而Word无法将其模板区域指向服务器路径,因为所有模板都需要脱机工作。 – 2010-05-28 10:55:11

+0

@Kenny使用查找表不排除继续使用Robocopy。它只是将从你的脚本复制哪个组的复制的逻辑移动到配置文件,并允许将所有模板保存在一起。 – Filburt 2010-05-28 11:04:38

+0

我今天要查看您的解决方案,并找出这些答案中哪一个最适合我。虽然赞扬这个:) – 2010-06-01 06:10:37

1

客户

下面是关于删除旧文件复制的那些用于删除模板目录中的文件的脚本,该用户的机器不存在于复制的文件组之一中。为了清楚起见,代码在这个答案的末尾。以下是如何在当前解决方案中使用不使用/MIR的脚本。

在每个组复制的代码,添加一个额外的方法调用“ListFiles” - 这跟踪从服务器复制文件:

If User is MemberOf (group3) Then 
    RoboCopy.exe \\fileserver\templates\group3\ c:\templates\workgroup *.* /E /XO 
    ListFiles("\\fileserver\templates\group3\", userTemplates) 
End if 

这样做对每一组复制。 (如果相同的模板出现在多个组这是确定)。

毕竟团体已经被复制,添加此代码块:

ListFiles "c:\templates\workgroup", toDelete 
    removeAllFrom toDelete, userTemplates 

这将列出在用户的本地模板文件夹中的所有文件到toDelete。所有刚刚复制的文件将从该组中删除,只留下未从服务器复制的文件。然后我们可以打印要删除的文件,然后实际删除它们。

echoDictionary "deleting old user templates", toDelete 
    ' deleteFiles c:\templates\workgroup", toDelete 

deleteFiles调用注释掉 - 可能明智地做一个试运行! deleteFiles的第一个参数是用户的模板目录 - 它不应该有一个结尾的斜杠。

通过这些更改,用户机器上模板文件夹中未从服务器复制的任何文件都将被删除,从而有效地提供多目录同步。

现在来了脚本。第一个块可以粘贴到文件的顶部,其余的在底部,以帮助避免混乱。

// script to remove files not present on one of the group folders on the fileserver 

Set fs = CreateObject("Scripting.FileSystemObject") 
Set userTemplates = CreateObject("Scripting.Dictionary") 
userTemplates.CompareMode = 1 
Set toDelete = CreateObject("Scripting.Dictionary") 
toDelete.CompareMode = 1 

-- under here are just procedures so they can go at 
-- the bottom of your script if desired 

Sub deleteFiles(basedir, dictionary) 
    for each key in dictionary.Keys 
     fs.DeleteFile(basedir+"\"+key)    
    next 
End Sub 

Sub echoDictionary(msg, dictionary) 
    for each key in dictionary.Keys 
     Wscript.Echo msg & ": " & key 
    next 
End Sub 


Sub removeAllFrom(target, toRemove) 
    for each key in toRemove.Keys 
     if target.Exists(key) then 
     target.remove key 
     end if 
    next 
End Sub 

Sub ListFiles(folderName, dictionary) 
    Set folder = fs.GetFolder(folderName) 
    ListSubFolders folder, "", dictionary 
End Sub 

Sub ListSubFolders(folder, prefix, dictionary) 
    Set files = folder.Files 
    For Each file in files 
     qualifiedName = prefix & file.Name 
     dictionary.add qualifiedName, file 
    Next 

    For Each Subfolder in Folder.SubFolders 
     qualifiedName = prefix+Subfolder.Name & "\" 
     ListSubFolders Subfolder, qualifiedName, dictionary 
     dictionary.add qualifiedName, Subfolder 
    Next 
End Sub 
+0

@Kenny - 你有机会尝试这个吗? – mdma 2010-06-01 09:50:33

+0

不,我没有,但我想设置这是答案。但检查图标是淋病。 – 2010-06-02 06:05:36

+0

不幸的是,当您在7天赏金期结束前未选择答案时会发生这种情况。 (自动选择只会选择评分为2或更高的最高答案。) – mdma 2010-06-02 15:02:05

相关问题