Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Унифицировать Скрипт копирования (http://forum.oszone.net/showthread.php?t=296124)

red.army@vk 27-02-2015 07:18 2476481

Унифицировать Скрипт копирования
 
Всем привет. Помогите Унифицировать скрипт копирования бекапов 1с.
- Скрипт копирует файлы бекапов баз 1с (.dt или .zip) на сетевую шару
- Проверяет наличие скопированного файла на шаре
- Отправляет письмо о недостующих (не случившихся) бекапах
-------------------------------
Базы прибавляются слишком быстро, уже около 30. И просто неудобно каждый раз добавлять новую строку в скрипт.

Код:

$date = (Get-Date -uformat "%d.%m.%Y")
$a = $b = $c = $d = $e = $f = $g = $h = $i = $j = $k = $m = $n = $o = $p = $q = $r = $s = $t = $x = $v = $u = $buh<HIDE> = $zup<HIDE> = $alpha = 0

copy-item c:\BackUP_1C\Alpha_<HIDE>\BackupTmp.zip \\<HIDE>\backup\1c\Alpha\Alpha_<HIDE>_$date.zip
copy-item c:\BackUP_1C\buh8\*.dt \\<HIDE>\backup\1c\buh8\Buh8_<HIDE>_$date.dt
copy-item c:\BackUP_1C\buh82\*.dt \\<HIDE>\backup\1c\buh82\Buh82_<HIDE>_$date.dt
copy-item c:\BackUP_1C\buhCKS8\BackupTmp.dt \\<HIDE>\backup\1c\buhCKS8\BuhCKS8_<HIDE>_$date.dt
copy-item C:\BackUP_1C\BuhCKS82\*.dt \\<HIDE>\backup\1c\BuhCKS82\BuhCKS82_<HIDE>_$date.dt
copy-item c:\BackUP_1C\crm\BackupTmp.dt \\<HIDE>\backup\1c\crm\CRM_<HIDE>_$date.dt
copy-item c:\BackUP_1C\eco\*.dt \\<HIDE>\backup\1c\eco\ECO_<HIDE>_$date.dt
copy-item c:\BackUP_1C\Kandidat\BackupTmp.dt \\<HIDE>\backup\1c\Kandidat\Kandidat_<HIDE>_$date.dt
copy-item c:\BackUP_1C\kredit\BackupTmp.dt \\<HIDE>\backup\1c\kredit\Kredit_<HIDE>_$date.dt
copy-item c:\BackUP_1C\orgteh\*.dt \\<HIDE>\backup\1c\orgteh\Orgteh_<HIDE>_$date.dt
copy-item c:\BackUP_1C\SpecOdejda\BackupTmp.zip \\<HIDE>\backup\1c\SpecOdejda\SpecOdejda_<HIDE>_$date.zip

copy-item c:\BackUP_1C\Strah\BackupTmp.zip \\<HIDE>\backup\1c\strah\Strah_<HIDE>_$date.zip
copy-item c:\BackUP_1C\traktir\*.dt \\<HIDE>\backup\1c\traktir\Traktir_<HIDE>_$date.dt
copy-item c:\BackUP_1C\ZikBuh\BackupTmp.zip \\<HIDE>\backup\1c\zikbuh7\ZikBuh7_<HIDE>_$date.zip
copy-item C:\BackUP_1C\ZikCKS7\BackupTmp.zip \\<HIDE>\backup\1c\zikCKS7\ZikBuhCKS7_<HIDE>_$date.zip
copy-item C:\BackUP_1C\zikeco\BackupTmp.dt \\<HIDE>\backup\1c\zikeco\ZikECO_<HIDE>_$date.dt
copy-item C:\BackUP_1C\zik<HIDE>NM\BackupTmp.zip \\<HIDE>\backup\1c\zik<HIDE>NM\Zik<HIDE>NM_<HIDE>_$date.zip
copy-item C:\BackUP_1C\Zik<HIDE>MY\BackupTmp.zip \\<HIDE>\backup\1c\Zik<HIDE>MY\Zik<HIDE>MY_<HIDE>_$date.zip
copy-item C:\BackUP_1C\zik<HIDE>RA\BackupTmp.zip \\<HIDE>\backup\1c\zik<HIDE>RA\Zik<HIDE>RA_<HIDE>_$date.zip
copy-item C:\BackUP_1C\ZupEco82\*.dt \\<HIDE>\backup\1c\ZupEco82\ZupEco82_<HIDE>_$date.dt
copy-item C:\BackUP_1C\BuhAru82\*.dt \\<HIDE>\backup\1c\BuhAru82\BuhAru82_<HIDE>_$date.dt
copy-item c:\BackUP_1C\ZikAru\BackupTmp.zip \\<HIDE>\backup\1c\ZikAru\ZikAru_<HIDE>_$date.zip
copy-item C:\BackUP_1C\Buh<HIDE>\*.dt \\<HIDE>\backup\1c\Buh<HIDE>\Buh<HIDE>_<HIDE>_$date.dt
copy-item C:\BackUP_1C\Zup<HIDE>\*.dt \\<HIDE>\backup\1c\Zup<HIDE>\Zup<HIDE>_<HIDE>_$date.dt
copy-item C:\BackUP_1C\alpha5\*.dt \\<HIDE>\backup\1c\alpha5\Alpha5_<HIDE>_$date.dt


if(!(Test-Path \\<HIDE>\backup\1c\alpha\Alpha_<HIDE>_$date.zip)){$a = "BackUP Alpha FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\buh8\Buh8_<HIDE>_$date.dt)){$b = "BackUP Buh8 FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\buh82\Buh82_<HIDE>_$date.dt)){$c = "BackUP Buh82 FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\buhCKS8\BuhCKS8_<HIDE>_$date.dt)){$d = "BackUP BuhCks8 FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\BuhCKS82\BuhCKS82_<HIDE>_$date.dt)){$e = "BackUP BuhCks82 FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\crm\CRM_<HIDE>_$date.dt)){$f = "BackUP CRM FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\eco\ECO_<HIDE>_$date.dt)){$g = "BackUP ECO FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\Kandidat\Kandidat_<HIDE>_$date.dt)){$h = "BackUP Kandidat FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\kredit\Kredit_<HIDE>_$date.dt)){$i = "BackUP Kredit FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\orgteh\Orgteh_<HIDE>_$date.dt)){$j = "BackUP Orgteh FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\SpecOdejda\SpecOdejda_<HIDE>_$date.zip)){$k = "BackUP SpecOdejda FAIL"}

if(!(Test-Path \\<HIDE>\backup\1c\strah\Strah_<HIDE>_$date.zip)){$m = "BackUP Strahovanie FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\traktir\Traktir_<HIDE>_$date.dt)){$n = "BackUP Traktir FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\zikbuh7\ZikBuh7_<HIDE>_$date.zip)){$o = "BackUP ZikBuh7 FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\zikCKS7\ZikBuhCKS7_<HIDE>_$date.zip)){$p = "BackUP ZikBuhCKS7 FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\zikeco\ZikECO_<HIDE>_$date.dt)){$q = "BackUP ZikECO FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\zik<HIDE>NM\Zik<HIDE>NM_<HIDE>_$date.zip)){$r = "BackUP Zik<HIDE>MN FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\Zik<HIDE>MY\Zik<HIDE>MY_<HIDE>_$date.zip)){$s = "BackUP Zik<HIDE>MY FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\zik<HIDE>RA\Zik<HIDE>RA_<HIDE>_$date.zip)){$t = "BackUP Zik<HIDE>RA FAIL"}

if(!(Test-Path \\<HIDE>\backup\1c\ZupEco82\ZupEco82_<HIDE>_$date.dt)){$x = "BackUP ZupEco82 FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\BuhAru82\BuhAru82_<HIDE>_$date.dt)){$v = "BackUP BuhAru82 FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\ZikAru\ZikAru_<HIDE>_$date.zip)){$u = "BackUP ZikAru FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\Buh<HIDE>\Buh<HIDE>_<HIDE>_$date.dt)){$buh<HIDE> = "BackUP Buh<HIDE> FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\Zup<HIDE>\Zup<HIDE>_<HIDE>_$date.dt)){$zup<HIDE> = "BackUP zup<HIDE> FAIL"}
if(!(Test-Path \\<HIDE>\backup\1c\Alpha5\Alpha5_<HIDE>_$date.dt)){$alpha = "BackUP alpha5 FAIL"}

if($a -eq $b -eq $c -eq $d -eq $e -eq $f -eq $g -eq $h -eq $i -eq $j -eq $k -eq $m -eq $n -eq $o -eq $p -eq $q -eq $r -eq $s -eq $t -eq $x -eq $v -eq $u -eq $buh<HIDE> -eq $zup<HIDE> -eq $alpha -eq 0)
{
Write-host "ALL Backups done"
Send-MailMessage -To "<HIDE>@ava-<HIDE>.ru" -Cc "<HIDE>@ava-<HIDE>.ru"  -From "report@ava-<HIDE>.ru" -Subject "BackUp SUCCESS!!!" -Body "ALL backups 1c done" -SmtpServer <HIDE>
}
Else {
Send-MailMessage -To "<HIDE>@ava-<HIDE>.ru"  -From "report@ava-<HIDE>.ru"  -Subject "BackUp FAIL!!!" -Body "$a
$b
$c
$d
$e
$f
$g
$h
$i
$j
$k
$m
$n
$o
$p
$q
$r
$s
$x
$t
$v
$u
$buh<HIDE>
$zup<HIDE>
$alpha" -SmtpServer <HIDE>
}



Была идея подключаться к серверам 1с и брать оттуда названия баз, подключаться к ним и бекапить. Но готового решения для работы с сервером 1с через powershell не нашел.

Kazun 27-02-2015 08:33 2476495

Код:

$date = (Get-Date -uformat "%d.%m.%Y")

$bad = @()

$base = @{
        "C:\BackUP_1C\Alpha_<HIDE>\BackupTmp.zip" = "\\<HIDE>\backup\1c\Alpha\Alpha_<HIDE>_$date.zip"
        "c:\BackUP_1C\buh8\*.dt" = "\\<HIDE>\backup\1c\buh8\Buh8_<HIDE>_$date.dt"
}

$base.GetEnumerator() | Foreach {
        $message = $_.Name + " - FAIL"
        try {
                Copy-Item $_.Name $_.Key -ErrorAction Stop
                if(!(Test-Path $_.Key)){
                        $bad += $message
                }       
        }
        catch {
                $bad += $message
        }
}

$body = $bad | Out-String

if(!$body)
{
        Write-host "ALL Backups done"
        Send-MailMessage -To "<HIDE>@ava-<HIDE>.ru" -Cc "<HIDE>@ava-<HIDE>.ru"  -From "report@ava-<HIDE>.ru" -Subject "BackUp SUCCESS!!!" -Body "ALL backups 1c done" -SmtpServer <HIDE>
}
Else {
        Send-MailMessage -To "<HIDE>@ava-<HIDE>.ru"  -From "report@ava-<HIDE>.ru" -Subject "BackUp FAIL!!!" -Body $body -SmtpServer <HIDE>
}


red.army@vk 27-02-2015 08:55 2476499

Базы при этом, все равно прописывать?
Может посчитать папки в C:\BackUP_1C\* ?

Kazun 27-02-2015 09:00 2476501

Да, прописывать. С таким успехом можно просто копировать папку copy-item c:\BackUP_1C.

Код:

robocopy c:\BackUP_1C \\<HIDE>\backup\1c\ /s /e /log:C:\log.txt

Iska 27-02-2015 16:29 2476717

Цитата:

Цитата red.army@vk
Базы прибавляются слишком быстро, уже около 30. И просто неудобно каждый раз добавлять новую строку в скрипт. »

Заведите себе конфигурационный файл и работайте с ним.

red.army@vk 28-02-2015 13:06 2477024

Код:

$date = (Get-Date -uformat "%d.%m.%Y")
robocopy c:\BackUP_1C \\<HIDE>\backup\1c\ /s /e
Get-ChildItem \\<HIDE>\Backup\1c | foreach  {
Write-Host $_.name
Write-Host "\\<HIDE>\Backup\1c\$_\*$date*"
Test-Path -Path "\\<HIDE>\Backup\1c\$_\*$date*"
}

Почему $_ отрабатывает правильно, а $_.Name возвращает ИмяПапки.name и соответсвенно тест-патч всегда ложь?
Как при получении False сформировать массив имен папок для отправки на почту?

Как сформировать массив разобрался

Код:

$date = (Get-Date -uformat "%d.%m.%Y")
#robocopy c:\BackUP_1C \\<HIDE>\backup\1c\ /s /e
$bad = @()
Get-ChildItem \\<HIDE>\Backup\1c | foreach  {
Write-Host $_.name
Write-Host "\\<HIDE>\Backup\1c\$_\*$date*"
$message = $_.name + " - FAIL"
if(!(Test-Path -Path "\\<HIDE>\Backup\1c\$_\*$date*")){
$bad += $message
}
}
$body = $bad | Out-String
$body


red.army@vk 28-02-2015 13:21 2477040

Iska - расскажите пжст подробней...
Конф. файл к чему? 1с или POSH

Kazun 28-02-2015 15:55 2477091

Выполнить две команды и понять разницу, когда используются двойные кавычки(подробнее, как всегда в справке):
dir | Foreach {Write-Host "$_.Name"}

и

dir | Foreach {Write-Host "$($_.Name)"}


Не пойму зачем добавлять Test-Path, когда robocopy имеет прекрасный лог файл, который на порядок лучше этих бесполезных проверок.

Vadikan 28-02-2015 16:40 2477103

Kazun, а зачем вообще здесь двойные кавычки?
Код:

dir | Foreach {Write-Host $_.Name}
В этой↑ конструкции есть подвохи?

Iska 28-02-2015 19:29 2477137

Цитата:

Цитата red.army@vk
Iska - расскажите пжст подробней...
Конф. файл к чему? 1с или POSH »

К скрипту.

Как обычно — данные отдельно, код отдельно. Вместо того, чтобы:
Цитата:

Цитата red.army@vk
добавлять новую строку в скрипт »

— Вы добавляете строку в конфигурационный файл. Скрипт при запуске читает его и работает со считанными из него данными. Формат его может быть произвольным: обычный текстовый файл, ini-файл, xml — какой наиболее удобным окажется, тот и пользуйте, я детально в Вашу задачу не вникал.

red.army@vk 28-02-2015 20:01 2477142

Лог robocopy еще просматривать придется. Я хочу просто получить на почту список баз, что нужно вручную забекапить. А если тема письма Success то просто удалить его и даже не смотреть внутрь

Собственно я добился чего хотел, скрипт теперь не требует изменения, при увеличении кол-ва баз.
Осталось тоже сделать со скриптом самого бекапа.

Georgio 28-02-2015 21:15 2477173

Цитата:

Цитата Vadikan
Код:

dir | Foreach {Write-Host $_.Name}
В этой↑ конструкции есть подвохи? »




Vadikan, в этой конструкции, скорей всего, нет подвохов, но я думаю, что Kazun имел в виду это:


Код:

## Вариант 1:
dir | Foreach {Write-Host 'Something & $_.Name & something else.'}

## Вариант 2:
dir | Foreach {Write-Host 'Something & $($_.Name) & something else.'}

## Вариант 3:
dir | Foreach {Write-Host "Something & $_.Name & something else."}

## Вариант 4:
dir | Foreach {Write-Host "Something & $($_.Name) & something else."}



Только четвёртый вариант будет корректным. Варианты без кавычек я не рассматриваю, так как в моём примере присутствует символ, требующий использования кавычек ("&").


Время: 18:47.

Время: 18:47.
© OSzone.net 2001-