尝试使用SMO.Backup.AddDevice时,Powershell抛出转换异常

时间:2015-05-05 08:34:26

标签: sql powershell type-conversion smo database-restore

我对此完全感到困惑。我正在尝试使用SMO程序集编写一个简单的数据库恢复脚本。

当我尝试添加设备并传递路径时,如下所示:

$backup.Devices.AddDevice($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)

我得到一个奇怪的例外:

  

无法转换参数“1”,值为“文件”,“AddDevice”键入“Microsoft.SqlServer.Management.Smo.DeviceType”:“无法转换值”文件“键入”Microsoft.SqlServer.Management .Smo.DeviceType“。错误:”来自'Microsoft.SqlServer.Mana的无效转换   gement.Smo.DeviceType'到'Microsoft.SqlServer.Management.Smo.DeviceType'。“”   在D \Automatiskinläsning\ AutoImportPowershell.ps1:41 char:26   + $ backup.Devices.AddDevice<<<< ($ path,[Microsoft.SqlServer.Management.Smo.DeviceType] :: File)       + CategoryInfo:NotSpecified:(:) [],MethodException       + FullyQualifiedErrorId:MethodArgumentConversionInvalidCastArgument

这是完整的脚本:

#ASSEMBLIES:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null

#HARDCODED VARIABLES:
$path = "C:\TestFolder\Bakfile.bak"
$server = "(local)"
$databas = "MyDatabase"

#SMO OBJECTS:
$srv = new-object Microsoft.SqlServer.Management.Smo.Server($server)
$res = new-object Microsoft.SqlServer.Management.Smo.Restore
$backup = new-object Microsoft.SqlServer.Management.Smo.Backup

#STARTING RESTORE:
$backup.Devices.AddDevice($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$backup.Database = $databas
$backup.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]::Database
$backup.Initialize = $TRUE
$backup.SqlBackup($srv)

$res.Devices.AddDevice($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$res.Database = $databas
$res.NoRecovery = $TRUE
$res.SqlRestore($srv)

让我感到困惑的是错误消息本身来自'Microsoft.SqlServer.Mana的无效转换 gement.Smo.DeviceType'到'Microsoft.SqlServer.Management.Smo.DeviceType'。那些听起来和我一样的类型!

1 个答案:

答案 0 :(得分:1)

您可以测试添加:

Add-Type -AssemblyName  Microsoft.SqlServer.Management.Common
Add-Type -AssemblyName  Microsoft.SqlServer.Management.Smo

#ASSEMBLIES:群组的末尾。

然后替换:

$backup.Devices.AddDevice($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)

$bdi = new-object Microsoft.SqlServer.Management.Smo.BackupDeviceItem($path, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$backup.Devices.Add($bdi)

BackupDeviceItem