2017-10-05 8 views
0

行の前にテキストを追加する方法を探しています。 具体的には、行の前と空白の前に。 現在、スクリプトは[companyusers]という行の後ろに自分のテキストを追加します。 しかし、[CompanytoEXT]の前と[CompanytoEXT]の上の空白の前に行を追加したいと思います。powershell:後でなく特定の行の前にテキストを追加する

どのように体はこれを行う方法を知っていますか?私がやりたいと思い何の

ビジュアル表現:https://imgur.com/a/lgH5i

私の現在のスクリプト:すべてのアドバイスのための

$FileName = "C:\temptest\testimport - Copy.txt" 
$Pattern = "[[\]]Companyusers" 
$FileOriginal = Get-Content $FileName 

[String[]] $FileModified = @() 
Foreach ($Line in $FileOriginal) 
{ 
    $FileModified += $Line 
    if ($Line -match $pattern) 
    { 
     #Add Lines after the selected pattern 
     $FileModified += "NEWEMAILADDRESS" 

    } 
    } 

Set-Content $fileName $FileModified 

ありがとう!

答えを探す場所を私に指示しても、非常に感謝しています。これはArrayListを使用して容易になるかもしれません

+0

有用な画像に基づいて、私はあなたの質問が少し誤解を招くと言います。私は、 "特定のiniファイルセクションの最後に行を挿入する"とは、意味をより良く伝えると思います。 – TToni

答えて

2

、あなたが特定のポイントで簡単に新しいデータを挿入することができ、そのよう:

$FileName = "C:\temptest\testimport - Copy.txt" 
$Pattern = "[[\]]Companyusers" 
[System.Collections.ArrayList]$file = Get-Content $FileName 
$insert = @() 

for ($i=0; $i -lt $file.count; $i++) { 
    if ($file[$i] -match $pattern) { 
    $insert += $i-1 #Record the position of the line before this one 
    } 
} 

#Now loop the recorded array positions and insert the new text 
$insert | Sort-Object -Descending | ForEach-Object { $file.insert($_,"NEWEMAILADDRESS") } 

Set-Content $FileName $file 

まず、ArrayListのにそれ以上の、ループをファイルを開きます。パターンが出現するたびに、別の配列$insertに前の位置を追加することができます。ループが完了したら、$insert配列内の位置をループし、それらを使用してテキストをArrayListに追加することができます。

+0

私は同じ設定をしていましたが、通常の配列を使用していました。これはarraylist(私はちょうど今週初めにピックアップしたもの)の素晴らしい使い方です。 Powershellのarraylistに関する興味深い記事:https://mcpmag.com/articles/2017/09/28/create-arrays-for-performance-in-powershell.aspx – Snak3d0c

+0

素晴らしい、ありがとう。私はarraylistsについてもっと学びます。 –

+0

あなたは大歓迎です!あなたの問題を解決するのに役立ちましたら[回答を受け入れてください](https://stackoverflow.com/help/someone-answers) – arco444

0

ここに少しステートマシンが必要です。正しいセクションを見つけたら、まだラインを挿入していないときに注意してください。次の空行(またはセクションがファイルの最後である場合はファイルの最後)にのみ挿入します。

はテストしていませんが、このようになります。

$FileName = "C:\temptest\testimport - Copy.txt" 
$Pattern = "[[\]]Companyusers" 
$FileOriginal = Get-Content $FileName 

[String[]] $FileModified = @() 

$inCompanyUsersSection = $false 

Foreach ($Line in $FileOriginal) 
{ 
    if ($Line -match $pattern) 
    { 
     $inCompanyUsersSection = $true 
    } 

    if ($inCompanyUsersSection -and $line.Trim() -eq "") 
    { 
     $FileModified += "NEWEMAILADDRESS" 
     $inCompanyUsersSection = $false 
    } 

    $FileModified += $Line 
} 

# Border case: CompanyUsers might be the last sction in the file 
if ($inCompanyUsersSection) 
{ 
    $FileModified += "NEWEMAILADDRESS" 
} 

Set-Content $fileName $FileModified 

編集:あなたが使用したくない場合は、アプローチ「次の空行に挿入し、」多分あなたのセクションでは、cludeに可能性があるため、空白行の場合は、次のセクション($line.StartsWith("["))の先頭に挿入をトリガーすることもできます。しかし、今は2行先を見なければならないので、それを書く前に1行をバッファリングしなければならないので、これは状況を複雑にします。やっぱり醜い。

+0

こんにちはトトニ、あなたの答えに感謝します。既に(Companyusersの直下)上部に空白スペースがある場合、私は何が必要かを知っていますか?そしてもう一つの空白は底にありますか? (これは、新しい電子メールアドレスで満たされる必要がある領域です。私はあなたのスクリプトをテストし、それが動作し、上部の空白の代わりに空白が埋められます。ありがとう! –

+0

私のアルゴリズムは、現在、2つのイベントを監視しています。1.興味深いセクションにあります。2.空白のラインに当たっています。第3のイベントを紹介することができます。3.新しいセクションを打ちました。これらの条件のいずれかを各行でチェックし、適切なアクションをマップします(新しいセクションがないことがわかるまで、空白行を書き留めておく必要があります)。個人的に私は別の方法をとっていきます:ファイルをキーとしてセクションを含むハッシュテーブルに読み込み、セクションラインの配列を値として読み込みます。次に、必要なセクションを変更して書き直します。しかしこれは順序を変更するかもしれないことに注意してください。 – TToni

関連する問題