简体   繁体   English

调用powershell函数,通过展开发送参数

[英]Calling a powershell function, sending parameters via splatting

I have a Powershell function that is calling "Restore-SqlDatabase" from the SqlPs module and sends parameters to the function via splatting. 我有一个Powershell函数,该函数从SqlPs模块调用“ Restore-SqlDatabase”,并通过展开将参数发送给该函数。 I'm trying to figure out why it's not working the way I expect it to. 我试图弄清楚为什么它没有按我期望的那样工作。 Here's my code: 这是我的代码:

$SqlParams = @{"ServerInstance"="'$ServerName'";
    "Database"="'$DatabaseName'";
    "BackupFile"="'$BackupFile'";}

if($Credential -ne $null) {
    $SqlParams.Add("SqlCredential", $Credential)
}

if($ReplaceDatabase) {
    $SqlParams.Add("ReplaceDatabase", $null)
}

try { $PathResult = Test-Path -Path $RestorePath } catch { $PathResult = $False }

if($PathResult) {
    Write-Verbose "RestorePath exists, using: $RestorePath"

    $RelocateData = New-Object 'Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'
    $RelocateData.LogicalFileName = $DatabaseName
    $RelocateData.PhysicalFileName = $(Join-Path -Path $RestorePath -ChildPath "$DatabaseName.mdf")

    $RelocateLog = New-Object 'Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'
    $RelocateLog.LogicalFileName = "$DatabaseName`_log"
    $RelocateLog.PhysicalFileName = $(Join-Path -Path $RestorePath -ChildPath "$DatabaseName`_log.ldf")

    $RelocateFile = @($RelocateData,$RelocateLog)
    $SqlParams.Add("RelocateFile", $RelocateFile)
}

try{
    Write-Verbose "Using the following parameters:"
    $paramString = $SqlParams | Out-String
    Write-Verbose $paramString 
    Restore-SqlDatabase @SqlParams
} catch { 
    Write-Error $_ 
    Write-Output "Restore failed..."
    return
}
Write-Output "Database successfully restored!"

When I run this, it fails to connect to the database. 当我运行它时,它无法连接到数据库。 Yet, when I run the command directly in the terminal, using a "param" hashtable and the same parameter values, it works exactly as expected. 但是,当我直接在终端中使用“参数”哈希表和相同的参数值运行命令时,它的工作原理与预期的完全一样。

Any tips for me? 对我有什么提示吗?

Here's some secret sauce. 这是一些秘密调味料。

Did this before the Restore-SqlDatabase call: Restore-SqlDatabase调用之前进行了此Restore-SqlDatabase

SQLCMD -S $ServerName -d master -Q "Alter Database [$DatabaseName] SET SINGLE_USER With ROLLBACK IMMEDIATE"

And did this after the Restore-SqlDatabase call: 并在Restore-SqlDatabase调用之后执行了此Restore-SqlDatabase

SQLCMD -S $ServerName -d master -Q "Alter Database [$DatabaseName] SET MULTI_USER WITH ROLLBACK IMMEDIATE"

All seems to work fine now. 现在似乎一切正常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM