web-dev-qa-db-ja.com

SQLエージェントジョブからのPowershellエラーのトラブルシューティング

SQLエージェントジョブに追加しようとしているPowerShellスクリプトがありますが、ジョブステップが次のエラーで失敗します

    A job step received an error at line 1 in a PowerShell script. The corresponding line is 'import-module SQLPS  -DisableNameChecking'. Correct the script and reschedule the job. The error information returned by PowerShell is: 'Could not load file or Assembly 'file:///C:\Program Files (x86)\Microsoft SQL Server\130\Tools\PowerShell\Modules\SQLPS\Microsoft.SqlServer.Management.PSSnapins.dll' or one of its dependencies. This Assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.

エラーの原因はモジュールパスの違いにあると考えたので、コードが正常に実行されるPowerShellセッションのパスと一致するように$ env:PSModulePathを介してパスを明示的に設定しました。私はpowershellにかなり慣れていないので、あなたが提供できるどんな助けでもありがたいです

現在、いくつかのテストを行っているだけなので、すべてがデスクトップ上でローカルに実行されています。 SQL Server 2012を実行しています。

3
Patrick

「PowerShell」タイプでSQLエージェントジョブステップを実行する場合、実際には(フル)PowerShellで実行されていません。このジョブステップタイプは、実際にはsqlps.exeミニシェルの下で実行されます。これは、PowerShell 1.0と非常に限られた数のコマンドレットに基づいています。

実際には、PowerShellジョブステップタイプはあまり役に立ちません。代わりに、「オペレーティングシステム/ CMDExec」ジョブステップを使用し、コマンドラインからPowerShell.exeを呼び出すことをお勧めします。

Cmdexecジョブステップタイプを使用すると、ジョブステップは次のようになります。

PowerShell.exe "D:\Scripts\MyScript.ps1" -NonInteractive

PowerShell.exeを呼び出すと、(ミニシェルの代わりに)完全/現在のPowerShellシェルを取得し、完全/現在のSQL Server PowerShellモジュールを使用できます。これは、SQL Server 2016+を使用している場合に特に重要です。SQLSERVERモジュールは、より長いコマンドレットのリストで拡張されています。

4
AMtwo

こちらのブログ投稿もご覧ください。 http://www.sqlhammer.com/running-powershell-in-a-sql-agent-job/

PowershellとSQLエージェントのジョブには、事前にいくつかの問題がある可能性があります。このブログ投稿では、それらとその回避方法について説明しています。基本的に、SQLによって読み込まれるモジュールは、スクリプトによって読み込まれるモジュールとは異なります。

2
Chris Lumnah