我对此完全感到困惑。我正在尝试使用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'。那些听起来和我一样的类型!
答案 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