2

invoke-sqlcmd を使用して 1 つのリモート サーバーに対してのみ tsql クエリを実行する PowerShell スクリプトを作成しようとしています。これらの 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:\ プロバイダーまたはその他のいずれかに変更され、このステップでスクリプトが失敗しました。

私はこれを正しい方法でやっていますか?もしそうなら、コマンドを期待どおりに実行するにはどうすればよいですか?

UPDATE 変数値をハードコードしてスクリプトを実行すると、必要な結果を得ることができます(この場合、デバイスからデータベースを復元します)。

フィードバックをお寄せいただきありがとうございます。

4

1 に答える 1

0

奇妙なことに、コマンドは現在機能しています。以前に何が間違っていたのかはよくわかりませんが、まったく同じコマンドが機能しています。同じ問題に直面している方への注意:

スクリプトで使用するInvoke-Sqlcmd必要がある場合は、特に後のコマンドが通常のコマンドInvoque-Sqlcmd(get、set、copy、new など) である場合は、プロバイダーの変更に注意してください。私の場合、スクリプトの 2 つのInvoke-sqlcmdコマンドの間のどこかで iローカル サーバーからリモート サーバーにファイルをコピーする必要がありました。プロバイダーが変更されたためにコマンドが失敗するたびに。回避策として、コマンドを実行set-locationする前にcopy-item、その操作でうまくいったように見えました (再コマンドが厳しいかどうかはわかりません。

Stackoverflow チームに感謝します

于 2016-06-24T09:22:27.650 に答える