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を実行しています。
「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
モジュールは、より長いコマンドレットのリストで拡張されています。
こちらのブログ投稿もご覧ください。 http://www.sqlhammer.com/running-powershell-in-a-sql-agent-job/
PowershellとSQLエージェントのジョブには、事前にいくつかの問題がある可能性があります。このブログ投稿では、それらとその回避方法について説明しています。基本的に、SQLによって読み込まれるモジュールは、スクリプトによって読み込まれるモジュールとは異なります。