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 スイッチは、2 番目のグループのコンテンツをミラーリングしているため、最初のグループからコンテンツを削除します。つまり、両方のコンテンツを持つことはできません。

これは、/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

ルックアップ テーブルの使用

すべてのテンプレートを 1 つの共通ファイル サーバー ディレクトリに配置し、ルックアップ テーブルを使用してテンプレートをグループに割り当てるアプローチをお勧めします。

利点は、テンプレートが同期されていることが保証されることです。つまり、グループ A、B、および C のテンプレートが、ファイル サーバー上のすべてのグループ固有のフォルダーで実際に同じであることを心配する必要はありません。

もう 1 つのボーナスは、ログオン スクリプトを変更する必要なく、テンプレートをグループに割り当てることができる保守可能な構成テーブルです。

ルックアップ テーブルの構成ファイルは次のようになります。

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
于 2010-05-28T09:55:13.467 に答える
1

クライアント上の古いファイルの削除

ユーザーのマシンがコピーしたファイル グループのいずれにも存在しないテンプレート ディレクトリ内のファイルを削除するスクリプトを次に示します。明確にするために、コードはこの回答の最後にあります。を使用しない現在のソリューションでスクリプトを使用する方法は次のとおり/MIRです。

コピーされた各グループのコードで、「ListFiles」へのメソッド呼び出しを 1 つ追加します。これにより、サーバーからコピーされたファイルが追跡されます。

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 に答える