1

Windows 2003 Server x86、Powershell 1.0 を使用していますが、次のような頭を悩ませる問題があります。以下のスクリプトを実行しようとすると、エラーが発生します。

Error "=" operator: System error. (Fehler beim "="-Operator: Systemfehler.)
+ $data =  <<<< Get-Content $log | % {

このスクリプトは次のとおりです。

$log = "C:\log file.txt"
$linePrefix = "PROCESS THIS LINE"
$trimStart = 25 #chars to ignore in the beginning
$started = 0

$data = Get-Content $log | % { 
    if ($_.length -ge $trimstart) { 
        $linedata = $_.substring($trimstart);
        $timesline = $linedata.startswith($lineprefix); 
        if ($started -eq 0 -and $timesline) { 
            $started = 1; 
        }
        if ($started) { 
            if ($timesline) { 
                $line = $linedata.substring($lineprefix.length).trimstart();
                if ($line.contains(": ")) {
                    write-output $line 
                } 
            } else { 
                break; 
            }
        }
    }
}

ただし、$data =割り当てなしで実行すると、完全に機能し、期待値が返されます。次のステートメントも試しました

$data = (...)
$data = $(...)

式を使用して関数を宣言しますが、成功しません。

なぜそれが起こるのか、ヒントを教えてください。

更新:割り当て記号の前後にスペースを削除しようとしましたが、同様のエラーが発生しましたが、現在、powershell は$data=G文字列が好きではありませんでした

Error "=" operator: System error (Fehler beim "="-Operator: Systemfehler.)
At C:\kosmo\scripts\ps\test.ps1:60 Symbol:7
+ $data=G <<<< et-Content $log | % {
4

3 に答える 3

0

自分のマシンで問題を再現することはできませんが、問題はbreak割り当て中のパイプライン内での使用に関連している可能性があると思います。最初のテストとして、を削除するとbreak、状況は変わりますか?

これが実際に問題であると仮定すると、割り当てを直接行わないように少しリファクタリングすることができます。$data代わりに、ループ自体の内部から変数を構築することができます。

$log = ".\logfile.log"
$linePrefix = "PROCESS THIS LINE"
$trimStart = 25 #chars to ignore in the beginning
$started = 0
$data = @()  # initialize blank data array

Get-Content $log | % { 
    if ($_.length -ge $trimstart) { 
        $linedata = $_.substring($trimstart);
        $timesline = $linedata.startswith($lineprefix); 
        if ($started -eq 0 -and $timesline) { 
            $started = 1; 
        }
        if ($started) { 
            if ($timesline) { 
                $line = $linedata.substring($lineprefix.length).trimstart();
                if ($line.contains(": ")) {
                    # add to your result here
                    $data += $line 
                } 
            } else { 
                break; 
            }
        }
    }
}

$dataあなたが欲しいものが含まれています。期待する結果の数によっては、これは最高のパフォーマンスのコードではない場合がありますが、開始できる場合があります。

于 2013-02-12T18:24:57.310 に答える
0

あなたのコードを String オブジェクトを返す関数に変換しました。したがって、次のように実行できます。

$data = Parse-LogFile

最初に関数をシェルにインポートする必要があります。これは、コピーして貼り付けるだけで実行できます。

Function Parse-LogFile
{
   $log = gc "C:\log file.txt"
   $linePrefix = "PROCESS THIS LINE"
   $trimStart = 25 #chars to ignore in the beginning
   $started = 0
   $ReturnText = New-Object System.Text.StringBuilder
   foreach ( $line in $log )
   {
      if ($_.length -ge $trimstart)
      {
         $linedata = $_.substring($trimstart);
         $timesline = $linedata.startswith($lineprefix);

         if ($started -eq 0 -and $timesline) 
         { 
            $started = 1; 
         }

         if ($started) 
         { 
            if ($timesline)
            {
               $line = $linedata.substring($lineprefix.length).trimstart();
               if ($line.contains(": "))
               {
                  $ReturnText.Append($line)
                  $ReturnText.AppendLine()
               }
            }
            else
            {
               break;
            }
         }
      }
   }

   Retrun $ReturnText.ToString()
}
于 2013-02-12T16:15:48.057 に答える