Помощь по началу работы с powershell - переписать старый файл BAT + SQL - PullRequest
1 голос
/ 10 ноября 2009

Я совершенно новичок в powershell, и мне нужна помощь, чтобы начать. Мне нужно написать небольшой скрипт, который будет резервировать базу данных SQL, но каждый раз под другим именем (только для последних 4-5 версий). Прямо сейчас у меня есть BAT, который просто запускает osql со сценарием sql, как показано ниже

REM BAT file starts here
"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" -S myServer -E -iC:\Scripts\backupDB.sql

И скрипт резервного копирования

BACKUP DATABASE [MyDB] TO  DISK = N'C:\Backup\MyDB.bak' WITH NOFORMAT, INIT,  NAME = N'MyDB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Эта BAT запускается планировщиком задач. Очевидно, что он не создает разные файлы резервных копий БД. Я хотел бы заменить все это сценарием powershell, который будет искать в целевом каталоге и сохранять только последние N резервных файлов (начиная с самого нового), а затем генерировать имя файла резервной копии, например

.
MyDB-yy.mmdd.hhmmss.bak 

и резервная копия в этом.

Я мог бы создать для этого простое консольное приложение C #, но я бы хотел начать играть и тестировать с Powershell.

Любая помощь приветствуется.

Спасибо

Ответы [ 2 ]

2 голосов
/ 11 ноября 2009

Или вы можете пропустить файл .sql и сделать что-то вроде этого. Это также можно сделать с помощью SMO, но поскольку вы упомянули C #, это может иметь для вас больше смысла.


$datePart = Get-Date -Format "yy.MMdd.HHmmss"
$oConn = New-Object System.Data.SqlClient.SqlConnection("Server=myServer;Database=master;Integrated Security=True")
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $oConn
$oConn.Open()
$SqlCmd.CommandText = "BACKUP DATABASE [MyDB] TO  DISK = N'C:\Backup\MyDB-$datePart.bak' WITH NOFORMAT, INIT,  NAME = N'MyDB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10"
$SqlCmd.ExecuteNonQuery()
$oConn.Close()
2 голосов
/ 11 ноября 2009

Примерно так должно работать:

if (Test-Path C:\Backup\MyDB.bak)
{
    Rename-Item C:\Backup\MyDB.bak `
                ("C:\Backup\MyDB-{0:yy.MMdd.hhmmss}.bak" -f (get-date))
}

Get-ChildItem C:\Backup\MyDB-*.bak | Sort Name -Desc | Select -skip 5 | 
    Remove-Item

$osql = "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe"
& $osql -S myServer -E -iC:\Scripts\backupDB.sql
...