【问题标题】:PowerShell: cannot convert type SMO.server to type SMO.serverPowerShell:无法将 SMO.server 类型转换为 SMO.server 类型
【发布时间】:2015-04-10 14:43:24
【问题描述】:

我从 PowerShell 得到的错误:

Cannot convert argument "srv", with value: "[DBADEV\SQL2008r2]", for "SqlBackup" to type "Microsoft.SqlServer.Management.Smo.Server": "Cannot convert the "[DBADEV\SQL2008r2]" value of type 
"Microsoft.SqlServer.Management.Smo.Server" to type "Microsoft.SqlServer.Management.Smo.Server"."
At line:23 char:1
+ $backup.SqlBackup($srv)
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

我正在尝试编写一个 PowerShell 脚本来将数据库从我们的生产箱恢复到我们的 DBADEV 箱。下面是我正在使用的代码,然后会产生错误。

#Clear Screen
cls

#load assemblies
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
$ErrorActionPreference = "Inquire"

# Restore [SQLSRV2k8-0102\SQL2008] instance

$BackupFile = Get-ChildItem "\\NetworkShare\r`$\MSSQL10.SQL2008\MSSQL\Backup\AdventureWorks2008r2" | select -Last 1

$BackupFile

$srv = New-Object Microsoft.SqlServer.Management.Smo.Server("DBADEV\SQL2008r2")
$res = New-Object Microsoft.SqlServer.Management.Smo.Restore
$backup = New-Object Microsoft.SqlServer.Management.Smo.Backup

$Backup.Devices.AddDevice($BackupFile, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$Backup.Database = "AdventureWorks2008r2"
$Backup.Action = [Microsoft.SqlServer.Management.Smo.BackupActionType]::Database
$backup.Initialize = $true
$backup.SqlBackup($srv)
$srv.Databases["AdventureWorks2008r2"].Drop()

$res.Devices.AddDevice($BackupFile, [Microsoft.SqlServer.Management.Smo.DeviceType]::File)
$res.Database = "AdventureWorks2008r2"
$res.NoRecovery = $true
$res.SqlRestore($srv)

这个错误对我来说似乎有点神秘(大多数 PowerShell 错误也是如此)。关于为什么会发生这种情况的任何想法?当我在这里使用 Mike Fal 的 powershell 脚本时,我也遇到了错误:http://www.mikefal.net/2014/07/22/restoreautomation-powershell-module/

似乎让我摆脱了这个错误的一件事是将“DBADEV\SQL2008r2”直接传递到 SQLRestore, 即$res.SqlRestore("DBADEV\SQL2008r2") instead of $res.SqlRestore($srv)

这现在会生成一条错误消息,指出“服务器 'DBADEV\SQL2008r2' 恢复失败

【问题讨论】:

    标签: powershell sql-server-2008-r2 powershell-3.0 smo


    【解决方案1】:

    根据我的经验,出现这种错误是因为变量中的名称/数据类型错误。

    我会尝试在“DBADEV\SQL2008r2”中转义\

    或尝试我在 MSDN 上找到的内容

    $srv = new-Object Microsoft.SqlServer.Management.Smo.Server("(local)")
    Write-Host $srv.Information.Version
    

    所以它看起来像

    New-Object Microsoft.SqlServer.Management.Smo.Server("(DBADEV\SQL2008r2)")

    【讨论】:

    • 不幸的是,这并没有解决问题。我尝试使用转义字符`,以便我的服务器写为“DBADEV`\SQL2008r2”。似乎让我克服了这个错误的一件事是将“DBADEV\SQL2008r2”直接传递到 SQLRestore,即 $res.SqlRestore("DBADEV\SQL2008r2") 而不是 $res.SqlRestore($srv)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多