3

更新:根据 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 企业版

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

SQL Server 2008 R2 SP1 10.5.2500.0 64 位

谢谢!

4

2 回答 2

3

是的,直到 SQL Server 2012 才真正实现适当的 PowerShell 支持(甚至对于它支持的 cmdlet 来说,这有点古怪)

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

要获得适当的 powershell 支持,您要么需要外壳并调用外部脚本,要么将作业作为 Windows 计划任务而不是代理作业运行。

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

SQLPS 和 PowerShell V2 的真相

于 2013-11-13T16:08:09.987 回答
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;
于 2014-04-21T04:23:41.887 回答