带有 PowerShell 步骤的 SQL Server 2012 SQL 代理作业在 Out-File cmdlet 上失败并出现“ReportWrongProviderType”错误

pet*_*411 5 powershell sql-server-2012 sql-server-agent

我们最近在 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"
Run Code Online (Sandbox Code Playgroud)

当作业运行时,它失败并显示以下错误消息:

作业步骤在 PowerShell 脚本的第 14 行收到错误。对应的行是 '$Query | Out-File -FilePath (Join-Path -Path $TargetDir -ChildPath $TargetFile) -Force -Encoding "utf8"'。更正脚本并重新安排作业。PowerShell 返回的错误信息为:“无法执行操作,因为操作“ReportWrongProviderType”无效。删除操作“ReportWrongProviderType”,或调查它为什么无效。

当我搜索interwebz 时,我找不到任何对“ReportWrongProviderType”的引用。关于 Out-File 调用有什么问题的任何想法?

pet*_*411 18

问题是 PowerShell 会话默认使用 SqlServer 提供程序。我在 Out-File cmdlet 之前将此语句添加到脚本中:

Set-Location c:
Run Code Online (Sandbox Code Playgroud)

这将提供程序更改为 FileSystem 提供程序,并允许 Out-File cmdlet 正确查找文件共享并创建文件。

本文对比了 SQL Server 2008 R2 与 SQL Server 2012/2014 中 SQLPS 的加载方式。SQL 提供程序使用 SQL Server 2008 R2 中的“Add-PSSnapin”cmdlet 加载,而从 SQL Server 2012 开始,使用“Import-Module”cmdlet。

作者指出:“加载模块 [使用‘Import-Module’] 的结果只是更改为您刚刚加载的 PSDrive。” 显然,'Add-PSSnapin' cmdlet 使其 SQLPS 会话的提供程序保持不变(作为文件系统)。cmdlet 使用的变化以及由此产生的会话行为是导致我出现问题的原因。