最近、Windows Server 2012(Windows Server 2008 R2から)でSQL Server 2012(SQL Server 2008 R2から)にアップグレードしました。以前はエラーなしで実行されていたSQL Serverジョブエージェントジョブが失敗しました。
ジョブには、Powershellジョブステップがあります。
$ErrorActionPreference = 'Stop'
$DateStamp = Get-Date -format "yyyyMMdd"
$BizUnit = 'SHB'
# Target File directory
$BaseDir = '\\MyFileServer\MyDirectory'
$Query = "EXEC dbo.usp_MyQuery '$BizUnit'"
$TargetFile = "MyTargetFile_" + $BizUnit + "_$DateStamp.xml"
$TargetDir = (Join-Path -Path $BaseDir -ChildPath $BizUnit)
$Query | Out-File -FilePath (Join-Path -Path $TargetDir -ChildPath $TargetFile) -Force -Encoding "utf8"
ジョブが実行されると、次のエラーメッセージで失敗します。
ジョブステップは、PowerShellスクリプトの14行目でエラーを受け取りました。対応する行は '$ Query |です。 Out-File -FilePath(Join-Path -Path $ TargetDir -ChildPath $ TargetFile)-Force -Encoding "utf8" '。スクリプトを修正し、ジョブを再スケジュールしてください。 PowerShellから返されるエラー情報は次のとおりです: '操作「ReportWrongProviderType」が無効なため、操作を実行できません。操作「ReportWrongProviderType」を削除するか、操作が無効である理由を調査してください。
Interwebzを検索すると、「ReportWrongProviderType」への参照が見つかりません。 Out-File呼び出しの何が問題になっているのですか?
問題は、PowerShellセッションがデフォルトでSqlServerプロバイダーを使用していることです。このステートメントをOut-Fileコマンドレットの前のスクリプトに追加しました。
Set-Location c:
これにより、プロバイダーがFileSystemプロバイダーに変更され、Out-Fileコマンドレットがファイル共有を正しく見つけてファイルを作成できるようになりました。
この記事 は、SQL Server 2008 R2とSQL Server 2012/2014でのSQLPSのロード方法を対照しています。 SQLプロバイダーは、SQL Server 2008 R2の「Add-PSSnapin」コマンドレットを使用してロードされますが、SQL Server 2012以降では、「Import-Module」コマンドレットが使用されます。
著者は、「['Import-Module'を使用して]モジュールをロードした結果は、ロードしたPSDriveに変更されるだけです」と述べています。明らかに、「Add-PSSnapin」コマンドレットは、SQLPSセッションのプロバイダーを変更していません(FileSystemとして)。コマンドレットの使用におけるその変更と、その結果のセッションの動作が、私の問題の原因でした。