2

バッチ電子メール ジョブに使用するテキスト ファイルがあります。現在、電子メールが送信されないように、ファイルを手動で調べて特定のエントリにフラグ (eomm:) を設定する必要があります。このファイルには、数百行を含めることができます。ファイルのスナップショットは次のとおりです。

reci:
reci:
subj:
body:
body: 
eomm:yes
reci:
reci:
subj:
body:Your request for...
body: 
eomm:no
reci:
reci:
subj:
body:Your request for...
body:app_name
body:
eomm:yes
reci:
reci:
subj:
body:Your request for...
body: 
eomm:yes
reci:
reci:
subj:
body:Your request for...
body: 
body: 
body: Please note that...
body:
body:Because the application you selected requires an install,...
eomm:yes

したがって、各メールは、2 つの「reci:」エントリ、1 つの「subj:」エントリ、2 つ以上の「body:」エントリ、および 1 つの「eomm:」エントリの順で開始されます。 現在、'body:' エントリが 2 つしかなく、'eomm:' 値が 'yes' に設定されているエントリを見つけて、'no' に変更する必要があります。 これは私が自動化する必要があるものです。

これまでのところ、このパターンを探してループするスクリプトがありますが、最後の一致のみを見つけます。(結果を出力ファイルに出力して、実際に何をしているかを確認しました)。これが私がこれまでに持っているものです:

$logfile = gc ./cstemail.txt
for ($i = 0; $i -lt $logfile.count; $i++) {
    if ($logfile[$i] -match 'subj:') {
      if ($logfile[$i + 1] -match 'body:') {
        if ($logfile[$i + 2] -match 'body:') {
            if ($logfile[$i + 3] -match 'eomm:yes') {
                    $logfile[$i + 3].replace('eomm:yes','eomm:no')
                }
            }
        }
    }
}

私の最終的なスクリプトは、これらの行を見つけて、「eomm:yes」を「eomm:no」に置き換える必要があります。私が持っているもので動作するはずですが、置換機能は動作しません。私も運が悪いので、次のことを試しました:

$logfile[$i + 3] -replace 'eomm:yes','eomm:no'
4

2 に答える 2

2

新しい文字列を何にも割り当てていないことを除いて、コードは機能します。置換は新しい文字列を返します (文字列は不変です)。

$logFile[$i + 3] = $logfile[$i + 3].replace('eomm:yes','eomm:no')

また、配列の内容をファイルに書き戻す必要があります。

$logFile > YourFileName.txt
于 2013-09-25T18:26:25.473 に答える
1

これは Powershell 固有のソリューションではありませんが、次の複数行の正規表現の置換を実装できます。

探す:

((reci:\r\n){2}subj:\r\n(body:.*\r\n){2}eomm:)(yes)

交換:

$1no

サンプル入力を使用して、このオンライン正規表現テスターで正しく実行されます。

これを行う方法を説明するために、サンプル スクリプトを作成しました。

$entireFile = [Io.File]::ReadAllText(".\input.txt")
$nl = [Environment]::NewLine

$newLines = $entireFile -replace "(?m)((reci:${nl}){2}subj:${nl}(body:.*${nl}){2}eomm:)(yes)", '$1no'
$newLines > "output.txt"

# Show differences
compare-object -referenceObject $(gc "input.txt") -differenceObject $(gc "output.txt")
于 2013-09-25T18:09:33.957 に答える