我试图编写一个PowerShell脚本,该脚本将使用invoke-sqlcmd仅对一个远程服务器执行tsql查询。那些tsql查询很简单,比如备份/恢复数据库,创建用户等等。 以下是它的摘录:
# 5 # Create clientdb database on secondary server by restoring the full backup for primary
Try {
Invoke-sqlcmd -ServerInstance 'REMOTESQLSRV'`
-Username 'ts_sql' -Password 'somepassword'`
-InputFile "$LScltid\__01_On_Secondary_CreateDB2_srv2.sql"`
-ErrorAction Stop
Write-Host " clt_$id is now restored to secondary server "`
-ForegroundColor White -BackgroundColor Green
} Catch {
Write-Host " Restore operation for clt_$id did not succeed. Check the error logs " -ForegroundColor Black -BackgroundColor Red
}
我的脚本总是在这里打破。由于某些原因我无法理解,invoke-sqlcmd不使用变量" $ LScltid"解决它将找到.sql脚本的路径。
每次我必须运行它时,它会将当前目录更改为SQLERVER:\ provider或其他一些导致脚本在此步骤失败的目录。
我这样做是对的吗?如果是这样,我应该如何调整命令以按照我的预期执行。?
更新 忘了提一下,如果我运行带有硬编码变量值的脚本我能够得到我需要的结果(在这种情况下从设备恢复数据库)。
感谢您的反馈。
答案 0 :(得分:0)
奇怪的是,命令现在正在运行。我真的不知道我以前做错了什么,但完全相同的命令现在正在工作。 只是面对那些面临同样问题的人:
如果必须在脚本中使用Invoke-Sqlcmd
,请注意提供者更改,尤其是Invoque-Sqlcmd
之后的命令是常规命令(获取,设置,复制,新建等等)。 )
在我的情况下,在我的脚本中的两个Invoke-sqlcmd
命令之间我必须将文件从本地复制到远程服务器。每次命令失败,因为提供程序已更改。作为set-location
命令执行之前的copy-item
的解决方法,该操作似乎可以解决问题(不知道它是否重新命令了。
感谢 Stackoverflow团队