1

我对 powershell 完全陌生,我需要一些帮助才能开始。我需要编写一个备份 SQL 数据库的小脚本,但每次都使用不同的名称(仅保留最后 4-5 个版本)。现在我有一个BAT,它只是用一个sql脚本启动osql,如下所示

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 进行游戏和测试。

任何帮助表示赞赏。

谢谢

4

2 回答 2

2

或者您可以跳过 .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()
于 2009-11-11T18:50:45.387 回答
2

像这样的东西应该工作:

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
于 2009-11-11T00:07:26.117 回答