4

好的,这是我的问题。我正在做一个登录脚本,它基本上将 Microsoft Word 模板从服务器路径复制到每台计算机的本地路径。这是通过检查组成员身份来完成的。

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 开关了。理解?

那么,我该怎么办?我做了一个小脚本,基本上检查文件夹和文件,然后相应地删除它们,但这实际上最终与 /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 上的任何文件或文件夹是否确实存在于任一源中。如果他们不这样做,请将它们从我的本地路径中删除。也许可以在这些成员检查中组合一些东西?

4

2 回答 2

2

使用查找表

我建议一种将所有模板放入一个公共文件服务器目录并使用查找表将模板分配给组的方法。

这样做的好处是您的模板可以保证是同步的;也就是说,您不必担心组 A、B 和 C 的模板在文件服务器上的所有组特定文件夹中实际上是相同的。

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

查找表配置文件看起来像

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

第 1 列列出您的广告组名称;第 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
于 2010-05-28T09:55:13.467 回答
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
于 2010-05-31T18:33:15.707 回答