вторник, 14 июля 2015 г.

Windows PowerShell массовое копирование файла по папкам, с проверкой по размеру и с исключением некоторых папок

Задача: есть самописная программа, обновляемая перезаписью нового exe-файла. Установлена у более 10 пользователей в сетевую папку для каждого пользователя вида \\programs\userN\programma. Также в папку programma вложена папка install, в которой есть установочный файл с таким же именем, который требуется обновлять. Требуется из папки, в которой будет лежат новый файл и сам скрипт, запускать копирование в сетевые папки пользователей, причем в папке install не перезаписывать, обновленные файлы также не перезаписывать. То что файл обновлен, сверяем по размеру файла. Процесс нужно логировать.

Решение:
# сетевой каталог, в котором папки пользователей с программами
$PathToPrograms = "\\dfs\programs"

# файл должен лежать в каталоге запуска *.ps1
$FileForUpdate = "file.exe"

# вычисляем размер нового файла
$SizeFileForUpdate = (ls $FileForUpdate).Length

# формируем имя лога
$CurrentDate = Get-Date -Format "dd-MM-yyyy"
$PathLOG = "backup-" + $CurrentDate +".log"

# Создание пустого файла лога, с перезаписью при наличии старого
New-Item $PathLOG -ItemType file -Force

# не обновлять в папке install, не обновлять уже обновленные. Для лога печатаем полный путь и размер
ls $PathToPrograms -File $FileForUpdate -Recurse -Force | foreach `
     # исключаем файлы, в пути содержащие install
   { if( -Not ([string]$_.FullName).Contains("install") -and `
                     $_.Length -ne $SizeFileForUpdate) `
       # логирование полного пути и размера файла до копирования
       {Out-File -FilePath $PathLOG -InputObject $_.Fullname, "Было: ", $_.Length `
                                                                                         -Append -encoding unicode
     
        # логирование через конвеер, PassThru - выводит подробную информацию
        Copy-Item $FileForUpdate -Destination $_.FullName -PassThru | `
                                         Out-File -FilePath $PathLOG -Append -encoding unicode } }

Комментариев нет:

Отправить комментарий