2017-10-05 91 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 

感謝您的諮詢!

即使你只是指着我在哪裏尋找答案,它將非常感激。

+0

基於有用的圖像,我會說你的問題有點誤導。我認爲「在特定的ini文件部分末尾插入一行」可以更好地傳達含義。 – TToni

回答

2

這可能使用ArrayList更容易,這樣你可以在一個特定的點輕鬆地插入新的數據:

$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

我有相同的設置,但有一個正常的數組,這使得它更加困難。這是一個陣列列表的好用法(本週早些時候我剛剛提到的東西)。有趣的閱​​讀關於在powershell arraylist:https://mcpmag.com/articles/2017/09/28/create-arrays-for-performance-in-powershell.aspx – Snak3d0c

+0

Awsome,感謝您的幫助。我將研究更多關於數組列表的知識。 –

+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("["))。然而,這會使事情變得複雜,因爲現在你必須提前看兩行,這意味着在寫出之前你必須緩衝一行。可行但醜陋。

+0

嗨Ttoni,謝謝你的回答。如果我在頂部([公司用戶]正下方)有一個空白空間,您是否知道我需要做什麼?底部還有一個空白處? (這是需要填充新電子郵件地址的空間。我測試了你的腳本,它的工作原理是,只填充頂部而不是底部空白。謝謝! –

+0

我的算法目前監視兩個事件:1.我們在有趣的部分,2.我們打空白行。你可以引入第三個事件3.我們打了一個新的部分。只需檢查每一行是否存在這些條件,然後繪製出適當的操作(您必須推遲寫入空白行,直到您知道沒有新的部分出現爲止)。就我個人而言,我會採取另一種方式:將文件讀取到散列表中,該散列表包含作爲鍵的部分和作爲值的部分行的數組。然後修改所需的部分並再次寫出。請注意,這可能會修改順序。 – TToni

相關問題