2017-10-15 22 views
0

我有一個解決方案文件,其中包含一些項目,我想使用PowerShell刪除其中的一些。 目標是刪除一段包含以「Project」開頭並以「EndProject」結尾的字符串(假設爲「abcxyz」)的文本塊(或更多)。使用PowerShell解析解決方案文件

例如:

Project("{1111-2222-FFFF-3333}") = "AutoRun", "..\generate\Infra\generate\generate.csproj", "{999999-UUUUUU-GGGGGG-ABCDEFGH}" 
EndProject 
Project("{5555-2222-FFFF-3333}") = "SetupSec", "..\generate\Setup.csproj", "{999999-UUUUUU-GGGGGG-ABCDEFGH}" 
EndProject 
Project("{4444-2222-FFFF-3333}") = "Common.Fyyy", "..\generate\Infra\Common\Common.csproj", "{999999-UUUUUU-GGGGGG-ABCDEFGH}" 
EndProject 
Project("{9999-2222-FFFF-3333}") = "Command.Console", "..\generate\Path\Console.csproj", "{999999-UUUUUU-GGGGGG-ABCDEFGH}" 
EndProject 
Project("{7777-2222-FFFF-3333}") = "Infra.GUI", "..\..\generate\GUI.csproj", "{999999-UUUUUU-GGGGGG-ABCDEFGH}" 
    ProjectSection(ProjectDependencies) = postProject 
     {AAAA-2222-FFFF-3333} = {999999-UUUUUU-GGGGGG-ABCDEFGH} 
    EndProjectSection 
EndProject 

在上面的例子中,我想刪除項目包含在任何情況下,字符串「紅外」。 是否有一個簡單的方法使用PowerShell Regex? (缺失應做整個解決方案文件從項目EndProject

感謝,

曬。

回答

1

假設你的實際文件與樣本數據是一致的,你可以做到這一點,而無需亂用正則表達式的所有:

Get-Content $ProjectFile -Delimiter 'EndProject' | 
    Where-Object {$_ -notlike '*Infra*'} | 
    Add-Content $NewProjectFile 

這將打破文件到不同的項目,然後過濾掉任何其中包含字符串「Infra」,並將其餘的寫入新文件。

+0

實際文件與樣本數據不一致。解決方案文件是討厭的 – Ben

-1

你的問題是「有沒有在PowerShell中簡單的方法」,答案是:

解決方案的文件是一個討厭的舊格式與互相依賴的各種廣泛分離的部分。可以手動編輯它們,但很難正確,容易出錯。

如果您只是想刪除一些項目,請在Visual Studio中打開該文件,刪除這些項目並保存它。

如果這個問題是要解決一個更大的問題的一部分,你應該問一個新的問題,如何解決這個更大的問題。

+0

這個問題具體說明「_目標是刪除一個包含字符串(比如說」abcxyz「)的文本塊,以」Project「開始,並以」EndProject「結尾在下一行中。現在你如何將它看作是「從powershell中刪除Visual Studio項目」,只有上帝知道 –

+0

@ᴳᵁᴵᴰᴼ對我來說很明顯,但如果你沒有看到它,我想你只是看不到它。 – Ben

+1

我傾向於同意這裏。解決方案文件需要在內部保持一致,並且只是刪除引用可能會導致文件不一致,甚至無法打開(或者會生成多個「缺失引用」錯誤)。您基本上需要按照Visual Studio處理所有可能性的方式解析這些文件,這比正則表達式+刪除要複雜得多。 –