如何用powershell批量更改.net目标框架?

l2osamch  于 2023-04-06  发布在  Shell
关注(0)|答案(1)|浏览(155)

到目前为止,VS2022中不存在这种可能性。
我尝试使用powershell脚本批量更改解决方案的dotnet项目的目标框架,但我遇到了意外错误,更改没有发生:

function ToColor($color) {
    process { Write-Host $_ -ForegroundColor $color }
}
function GetProjects() {
    $dir = "C:\Users\username\repos\solution"
    $bins = Get-ChildItem -Filter *.csproj -Recurse -Path $dir
    $count = ($bins | measure).count
    return $bins
}
function SetVersion($file, $ver) {
    $xml = [xml](Get-Content $file)
    $name = $file.BaseName
    $currentVersion = ([string]$xml.Project.PropertyGroup.TargetFramework).Trim()
    if($ver -eq 5){
        $xml.Project.PropertyGroup.TargetFramework = "net5.0-windows"
    }
    if($ver -eq 6){
        $xml.Project.PropertyGroup.TargetFramework = "net6.0-windows"
    }
    if($ver -eq 7){
        $xml.Project.PropertyGroup.TargetFramework = "net7.0-windows"
    }
    $newv = ([string]$xml.Project.PropertyGroup.TargetFramework).Trim()

    "Setting new version for: "
    "$file"
    "[$currentVersion -> $newv]" | tocolor "green"
    # $xml.Save($file)
}

foreach ($p in GetProjects) {
    SetVersion $p.fullname 6
}

我的项目看起来像:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net5.0-windows</TargetFramework>
    <OutputType>Library</OutputType>

但我得到这个错误:

Setting new version for:
C:\Users\username\SolutionName\WpfDx12\WPFDX12.csproj
[net5.0-windows -> net5.0-windows]
The property 'TargetFramework' cannot be found on this object. Verify that the property exists and can be set.
At C:\Users\username\SolutionName\SetNetVersion.ps1:20 char:3
+         $xml.Project.PropertyGroup.TargetFramework = "net6.0-windows"
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyAssignmentException

最终为什么这个属性不能被设置?我如何用powershell批量更改TargetFramework

jhdbpxl9

jhdbpxl91#

你可能在csproj文件中有第二个<PropertyGroup>元素,它不包含<TargetFramework>元素。你用来进行更改的行并不针对特定的元素,而是试图将其应用于具有该文档结构的所有元素。其中一个抛出是因为你正在写入不存在的属性。
相反,您需要确保仅修改包含TargetFramework的PropertyGroup元素。您可以通过过滤目标节点来实现此目的。

$node = $xml.Project.PropertyGroup | Where-Object { $_.TargetFramework }
    $currentVersion = ([string]$node.TargetFramework).Trim()

    if($ver -eq 5){
        $node.TargetFramework = "net5.0-windows"
    }
    if($ver -eq 6){
        $node.TargetFramework = "net6.0-windows"
    }
    if($ver -eq 7){
        $node.TargetFramework = "net7.0-windows"
    }

从技术上讲,这仍然不是针对文档中的单个元素,如果有多个/Project/PropertyGroup/TargetFramework元素(因为PS中的值是如何聚合的),则会失败。但是,您不太可能在csproj文件的上下文中遇到这个问题。

相关问题