到目前为止,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
?
1条答案
按热度按时间jhdbpxl91#
你可能在csproj文件中有第二个
<PropertyGroup>
元素,它不包含<TargetFramework>
元素。你用来进行更改的行并不针对特定的元素,而是试图将其应用于具有该文档结构的所有元素。其中一个抛出是因为你正在写入不存在的属性。相反,您需要确保仅修改包含TargetFramework的PropertyGroup元素。您可以通过过滤目标节点来实现此目的。
从技术上讲,这仍然不是针对文档中的单个元素,如果有多个/Project/PropertyGroup/TargetFramework元素(因为PS中的值是如何聚合的),则会失败。但是,您不太可能在csproj文件的上下文中遇到这个问题。