Sql server SQL Server代理作业中的Powershell不存在';无法识别转换为CSV

Sql server SQL Server代理作业中的Powershell不存在';无法识别转换为CSV,sql-server,powershell,sql-server-2008-r2,powershell-2.0,sql-agent-job,Sql Server,Powershell,Sql Server 2008 R2,Powershell 2.0,Sql Agent Job,更新:根据SQLPS的要求修改脚本以在PS1的范围内工作。 更改: IF($property.Value -match $regex){ $currentBadLine = (ConvertTo-Csv $_ -NoTypeInformation -Delimiter $delimiter); $badLines += $currentBadLine[1,2] }; 致: 为每一行错误打

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

更改:

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

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

为每一行错误打印一个新的标题,但这不是世界末日,也不值得去阻止


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

现在,在连续两台服务器上,我已经确认PS主版本至少为2,并且以下代码段在Powershell ISE中运行良好。代码的目的是读入CSV的每一行,然后在列中循环,在$regex变量中查找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的名称, 函数、脚本文件或可操作程序。检查单词的拼写 名称,或者如果包含路径,请验证该路径是否正确,并且 再试一次。”

接下来的问题是:代理Powershell子系统是否使用与系统其余部分不同的Powershell版本?如果是这样,我如何找出子系统使用的是哪个版本,如果可能的话,升级它,以便修复此问题

服务器正在运行:

Windows Server 2008 R2企业版

PS主要版本2,次要版本0版本-1修订版-1

SQL Server 2008 R2 SP1 10.5.2500.0 64位


谢谢

是的,直到SQL Server 2012才真正实现正确的PowerShell支持(对于它支持哪些cmdlet,这一点甚至有点模糊)

在2008年和R2中,代理的powershell实现实际上是一个迷你shell,由现在(谢天谢地)已弃用的make-shell.exe实用程序创建,该实用程序只允许运行v1 cmdlet,并且不允许使用Add-PSSnapin,因此您无法再添加cmdlet

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

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


一个解决方法:将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;

令人惊叹的。我听说PS-SQLServer集成有一段时间很奇怪,但我认为这已经基本解决了。我想不是。谢谢
$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;