帶有 PowerShell 步驟的 SQL Server 2012 SQL 代理作業在 Out-File cmdlet 上失敗,並出現“ReportWrongProviderType”錯誤
我們最近在 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返回的錯誤資訊是:‘Cannot perform operation because operation “ReportWrongProviderType” is invalid。刪除操作“ReportWrongProviderType”,或調查其無效的原因。
當我搜尋 interwebz 時,我找不到任何對“ReportWrongProviderType”的引用。關於 Out-File 呼叫有什麼問題的任何想法?
問題是 PowerShell 會話預設使用 SqlServer 提供程序。我在 Out-File cmdlet 之前將此語句添加到腳本中:
Set-Location c:
這將提供程序更改為 FileSystem 提供程序,並允許 Out-File cmdlet 正確找到文件共享並創建文件。
本文對比了 SQLPS 在 SQL Server 2008 R2 與 SQL Server 2012/2014 中的載入方式。SQL Provider 在 SQL Server 2008 R2 中使用“Add-PSSnapin”cmdlet 載入,而從 SQL Server 2012 開始,使用“Import-Module”cmdlet。
作者指出:“載入模組的結果
$$ with ‘Import-Module’ $$只是更改為您剛剛載入的 PSDrive。”顯然,‘Add-PSSnapin’ cmdlet 使其 SQLPS 會話的提供程序保持不變(作為文件系統)。cmdlet 使用的變化以及由此產生的會話行為是導致我的問題的原因.