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

相關問題