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;
       };

悪い行ごとに新しいヘッダーを出力しますが、それは世界の終わりではなく、防止する努力に値するものではありません。


データのインポートが台無しになる前に CSV ファイルを前処理する Powershell スクリプトがあります。

2 台のサーバーで連続して 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' という用語は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれている場合は、パスが正しいことを確認してから再試行してください。'

問題は次のとおりです。エージェントの Powershell サブシステムは、システムの残りの部分とは異なるバージョンの Powershell を使用していますか? その場合、サブシステムが使用しているバージョンを確認し、可能であればアップグレードして、これを修正できるようにするにはどうすればよいですか。

サーバーが実行されています:

Windows Server 2008 R2 エンタープライズ

PS メジャー バージョン 2、マイナー 0 ビルド -1 リビジョン -1

SQL Server 2008 R2 SP1 10.5.2500.0 64 ビット

ありがとう!

4

2 に答える 2

0

1 つの回避策: Export-CSV をファイルにエクスポートしてから、ファイルから Get-Content を実行します。

$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 に答える