SQL Server代理作业的Powershell无法识别ConvertTo-CSV

时间:2013-11-13 15:30:18

标签: sql-server powershell sql-server-2008-r2 powershell-v2.0 sql-agent-job

更新:根据SQLPS的要求修改脚本以在PS1的范围内工作。

更改:

 IF($property.Value -match $regex){ 
                   $currentBadLine = (ConvertTo-Csv $_  -NoTypeInformation -Delimiter $delimiter);

                   $badLines += $currentBadLine[1,2]
            };

要:

IF($property.Value -match $regex){ 
              $badLines += $_ | Select-Object | ft -autoSize;
       };

为每条坏线打印一个新标题,但它不是世界末日,不值得努力防止。


我有一个Powershell脚本,可以在CSV文件有机会搞砸我的数据导入之前对其进行预处理。

在连续的两台服务器上,我已经确认PS主要版本至少为2,并且以下代码片段在Powershell ISE中正常运行。代码的目的是读取CSV的每一行,然后循环遍历列,查找$ regex变量中的正则表达式模式。当它找到一个我希望它在修复之前跟踪错误,这样我就可以在输出准备好导入的已清理文件之前编写错误日志。

%{
    Foreach($Property in $_.PSObject.Properties){

            IF($property.Value -match $regex){ 
                   $currentBadLine = (ConvertTo-Csv $_  -NoTypeInformation -Delimiter $delimiter);

                   $badLines += $currentBadLine[1,2]
            };

        $property.Value = $property.Value -replace $regex;
      } 

    $_

 }

但是,一旦我将代码放入代理工作中,代理就会抱怨:

  

'术语'ConvertTo-Csv'无法识别为cmdlet的名称,   功能,脚本文件或可操作程序。检查拼写   名称,或者如果包含路径,请验证路径是否正确   再试一次。 “

问题是:Agents Powershell子系统是否使用与系统其他部分不同的Powershell版本?如果是这样,我如何找出子系统使用的版本,如果可能的话,升级它以便我可以解决这个问题。

服务器正在运行:

Windows Server 2008 R2 Enterprise

PS Major version 2,Minor 0 Build -1 revision -1

SQL Server 2008 R2 SP1 10.5.2500.0 64位

谢谢!

2 个答案:

答案 0 :(得分:3)

是的,直到SQL Server 2012才真正实现了适当的PowerShell支持(即使它支持的cmdlet有点奇怪)

在2008和R2中,代理的powershell实现实际上是一个minishell,由现在(谢天谢地)弃用的make-shell.exe实用程序创建,该实用程序仅允许v1 cmdlet运行,并且不允许使用Add-PSSnapin以便您可以不再添加cmdlet。

要获得正确的PowerShell支持,您需要shell并调用外部脚本,或者将作业作为Windows计划任务而不是代理作业运行。

以下文章解释了为什么2008 R2中的PowerShell支持不能像您认为的那样工作:

The Truth about SQLPS and PowerShell V2

答案 1 :(得分:0)

一种解决方法:将CSV导出到文件,然后从文件中获取内容。

$rows = ,(New-Object PSObject -prop @{a=7; b='stuff';});
$rows +=,(New-Object PSObject -prop @{a=77; b='more';});

#To run from SQL Job, change from this:
$csvrows = $rows | ConvertTo-CSV -NoType | % {$_.Replace('"','')};
write-output $csvrows;

#to this:
$rows | Export-CSV -NoType "C:\Temp\T.csv"
$csvrows = (Get-Content "C:\Temp\T.csv") | % {$_.Replace('"','')};
write-output $csvrows;