Войти

Показать полную графическую версию : [решено] Унифицировать Скрипт копирования


red.army@vk
27-02-2015, 07:18
Всем привет. Помогите Унифицировать скрипт копирования бекапов 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
$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
Базы при этом, все равно прописывать?
Может посчитать папки в C:\BackUP_1C\* ?

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

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

Iska
27-02-2015, 16:29
Базы прибавляются слишком быстро, уже около 30. И просто неудобно каждый раз добавлять новую строку в скрипт. »
Заведите себе конфигурационный файл и работайте с ним.

red.army@vk
28-02-2015, 13:06
$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
Iska - расскажите пжст подробней...
Конф. файл к чему? 1с или POSH

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

и

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


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

Vadikan
28-02-2015, 16:40
Kazun, а зачем вообще здесь двойные кавычки?
dir | Foreach {Write-Host $_.Name}
В этой↑ конструкции есть подвохи?

Iska
28-02-2015, 19:29
Iska - расскажите пжст подробней...
Конф. файл к чему? 1с или POSH »
К скрипту.

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

red.army@vk
28-02-2015, 20:01
Лог robocopy еще просматривать придется. Я хочу просто получить на почту список баз, что нужно вручную забекапить. А если тема письма Success то просто удалить его и даже не смотреть внутрь

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

Georgio
28-02-2015, 21:15
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."}



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




© OSzone.net 2001-2012