Vbscript - создание сценария, который отражает несколько наборов папок - PullRequest
4 голосов
/ 21 мая 2010

Хорошо, это моя проблема. Я делаю logonscript, который в основном копирует шаблоны 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

Ранее я использовал ключ / MIR robocopy, который отлично работает. Но если пользователь является членом более чем одной группы, параметр / 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 на самом деле в каком-либо из источников. И если они этого не делают, удалите их из моего локального пути. Что-то, что можно было бы объединить в этих проверках членов?

Ответы [ 2 ]

2 голосов
/ 28 мая 2010

Использование справочной таблицы

Я бы предложил подход, который помещает все шаблоны в один общий каталог файлового сервера и использует таблицу поиска для назначения шаблонов группам.

Преимущество будет в том, что ваши шаблоны будут гарантированно синхронизированы; то есть вам не нужно беспокоиться о том, что шаблон для групп 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
1 голос
/ 31 мая 2010

Удаление старых файлов на клиенте

Вот скрипт, который удаляет файлы в каталоге шаблонов, которые пользовательский компьютер не присутствует ни в одной из скопированных групп файлов. Для ясности, код находится в конце этого ответа. Вот как использовать скрипт в вашем текущем решении, которое не использует /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
...