【问题标题】:Powershell from SQL Server Agent Job doesn't recognize ConvertTo-CSVSQL Server 代理作业中的 Powershell 无法识别 ConvertTo-CSV
【发布时间】:2013-11-26 06:58:47
【问题描述】:

更新:修改脚本以在 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,并且以下代码 sn-p 在 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 位

谢谢!

【问题讨论】:

    标签: sql-server powershell sql-server-2008-r2 powershell-2.0 sql-agent-job


    【解决方案1】:

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

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

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

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

    The Truth about SQLPS and PowerShell V2

    【讨论】:

    • 太棒了。我听说 PS - SQL Server 集成有一段时间很奇怪,但我认为这已经基本解决了。可能不会。谢谢。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 2017-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多