更新:根据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位
谢谢!
答案 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支持不能像您认为的那样工作:
答案 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;