2

我正在尝试编写一个 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:\ 提供程序或其他导致脚本在此步骤失败的其他目录。

我这样做对吗?如果是这样,我应该如何调整命令以按预期执行。?

更新 忘了提一下,如果我使用硬编码的变量值运行脚本,我能够得到我需要的结果(在这种情况下,从设备恢复数据库)。

感谢您的反馈。

4

1 回答 1

0

奇怪的是,该命令现在正在工作。我真的不知道我以前做错了什么,但完全相同的命令现在正在工作。只是提醒那些面临同样问题的人:

如果您必须Invoke-Sqlcmd在脚本中使用,请注意提供程序的更改,特别是如果后面的命令Invoque-Sqlcmd是常规命令(获取、设置、复制、新建等....)在我的情况下,在我的脚本中两个Invoke-sqlcmd命令之间的某个地方我必须将文件从本地复制到远程服务器。每次由于提供程序更改而导致命令失败。作为一种变通方法,我set-locationcopy-item执行命令之前执行该操作,并且该操作似乎可以解决问题(不知道它是否重新命令强硬。

感谢Stackoverflow 团队

于 2016-06-24T09:22:27.650 回答