web-dev-qa-db-ja.com

SQLエージェントPowerShell構文エラー

SQLエージェントジョブ(SQL Server 2016)内でPowerShellスクリプトをセットアップしようとしています。構文エラーが発生しているように見えるサードパーティのモジュールDBATOOLS.psd1を使用しています。現在、私のSQLジョブには1行のコードがあり、失敗しています:

Import-Module e:\dbatools-master\dbatools-master\dbatools.psd1

次のエラーでジョブが失敗するのはなぜですか?このコマンドは、PowerShell ISEで実行すると問題なく機能します。

Error Message: Unable to start execution of step 1 (reason: line(5): Syntax error).  The step failed.
6
Geoff Dawdy

これをSQL Serverエージェントジョブステップとして実行している場合は、PowerShellタイプではなくOperating system (CmdExec)ステップタイプを使用する必要があります。

CmdExec内で、必要なすべての手順を含むファイルをマシン上に作成し、それを呼び出すのが最善です。

たとえば、以下を含むファイルC:\PowerShellScripts\MyScript.ps1を作成します...

Import-Module e:\dbatools-master\dbatools-master\dbatools.psd1
Copy-SqlLogin -Source ServerA -Destination ServerB

次に、CmdExecジョブステップでpowershell.exe "& 'C:\PowerShellScripts\MyScript.ps1'"を使用してそのスクリプトを呼び出します。

5
Nic

通常、PowerShellステップを別のモジュールで使用できない理由を拡大するのがSQL Serverプロバイダーです。それはニースを再生しません、そして MSにこれを修正させるために項目を接続します があります。

ジョブステップに$erroractionpreference = 'stop'を追加すると、コマンドが誤っている理由の完全な出力が表示されます。

ユーザーとして実行:NT Service\SQLSERVERAGENT。 PowerShellスクリプトの92行目でジョブステップがエラーを受け取りました。対応する行は「if(Get-Command TabExpansionPlusPlus\Register-ArgumentCompleter -ErrorAction Ignore)」です。スクリプトを修正し、ジョブを再スケジュールしてください。 PowerShellによって返されるエラー情報は次のとおりです: 'SQL Server PowerShellプロバイダーエラー:パスSQLSERVER:\ TabExpansionPlusPlusが存在しません。有効なパスを指定してください。 '。プロセス終了コード-1。ステップは失敗しました。

一部の文字/コマンドを解釈する方法がわからないため、ほとんどの場合プロバイダーが問題です。 PowerShellステップタイプでPowerShell.exeホストのコンテキスト内にいる場合、私たちの生活は非常に簡単で素晴らしいことが起こります。

2
user507

興味深いことに、私のラボでは機能しませんが、別のエラーが発生します。 SQL2014環境でPowershellを使用してきましたが、問題が発生しました。2014年のPSプロバイダーに関連していると思い、cmdexecコマンドを使用してpowershellスクリプトを起動しました。

SQLエージェントのステップは2016年には次のようになり、うまくいきました enter image description here

1
sqlpadawan