Sql-Server-2012

帶有 PowerShell 步驟的 SQL Server 2012 SQL 代理作業在 Out-File cmdlet 上失敗,並出現“ReportWrongProviderType”錯誤

  • October 5, 2016

我們最近在 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 使用的變化以及由此產生的會話行為是導致我的問題的原因.

引用自:https://dba.stackexchange.com/questions/51775