【问题标题】:parsing solution file using powershell使用powershell解析解决方案文件
【发布时间】:2017-10-15 15:35:53
【问题描述】:

我有一个解决方案文件,其中包含一些项目,我想使用 PowerShell 删除其中一些项目。 目的是删除一个文本块,该文本块包含一个以“Project”开头并在下一行(或更多)中以“EndProject”结尾的字符串(比如说“abcxyz”)。

例如:

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

在上面的示例中,我想删除包含字符串“Infra”的项目。 有没有使用 PowerShell Regex 的简单方法? (应该删除从ProjectEndProject的整个解决方案文件)

谢谢,

夏。

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    我来这里是为了寻找类似的解决方案。我所做的是创建这个 powershell 函数。这可能只是一个很好的起点,您可以根据自己的更具体要求进行定制,但它对我有用。享受...

        function Remove-SourceControl() {
    
            param (
                [string]$sourceFilePathname
            )
    
            $tempFile = New-TemporaryFile
            $filterOn = $false
            $fileVersionCorrect = $false
    
            $backupFile = "$sourceFilePathname (backup)"
            Copy-Item $sourceFilePathname $backupFile
    
            $rowIndex = 1
    
            Get-Content -Path:$sourceFilePathname | ForEach-Object {
                if ($_ -like "*Microsoft Visual Studio Solution File, Format Version 12.00*" ) {
                    $fileVersionCorrect = $true
                }
                if ($fileVersionCorrect -eq $true) {
                    if ($_ -like "*TeamFoundationVersionControl*") { $filterOn = $true }
                    if (!$filterOn) {
                        Write-Output $_ | Out-File -FilePath:$tempFile -Append
                    }
                    if ($filterOn -and $_ -like "*EndGlobalSection*") { $filterOn = $false }
                } else {
                    Write-Output $_ | Out-File -FilePath:$tempFile -Append
                }
                $rowIndex++
            }
            if ($fileVersionCorrect -eq $true) {
                Copy-Item $tempFile $sourceFilePathname -Force
            }
            Remove-Item $tempFile
        }
    
        $path = "c:\some-folder-pathname"
    
        Remove-SourceControl "$path\MySoluton.sln"
    

    【讨论】:

      【解决方案2】:

      假设您的实际文件与示例数据一致,您可以做到这一点,而根本不需要弄乱正则表达式:

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

      这会将文件分解为单独的项目,然后过滤掉任何包含字符串“Infra”的项目,并将其余部分写入新文件。

      【讨论】:

      • 实际文件与样本数据不一致。解决方案文件很讨厌
      【解决方案3】:

      您的问题是“Powershell 中有没有简单的方法”,答案是:没有。

      解决方案文件是一种令人讨厌的旧格式,其中包含相互依赖的各种广泛分离的部分。可以手动编辑,但很难正确,也容易出错。

      如果您只是想删除一些项目,请在 Visual Studio 中打开文件,删除项目并保存。

      如果这个问题是为了解决一个更大问题的一部分,你应该问一个新问题,如何解决那个更大的问题。

      【讨论】:

      • 这个问题具体说“目的是删除一个包含字符串(比如说“abcxyz”)的文本块,该字符串以“Project”开头并在下一个以“EndProject”结尾行";现在您如何将其解读为“从 powershell 中删除 Visual Studio 项目”,只有上帝知道
      • @ᴳᵁᴵᴰᴼ 这对我来说很明显,但如果你没有看到它,我猜你只是没有看到它。
      • 我倾向于同意这里。解决方案文件需要在内部保持一致,仅删除参考很容易导致文件不一致,您甚至可能无法打开(或者会产生多个“缺少参考”错误)。您基本上需要以与 Visual Studio 处理所有可能性相同的方式解析文件,这比 regex + delete 复杂得多。
      • 伙计们,您可以将其视为常规文本文件,而不是解决方案文件。有没有可能(忽略这里的解决方案,我会做剩下的......)
      • @ShaiO,我不会花时间帮你伤害自己的!如果您告诉我您实际上要做什么,我也许可以提供帮助,但不要使用正则表达式编辑解决方案文件。只是不要。
      猜你喜欢
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 2010-10-06
      相关资源
      最近更新 更多