You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PowerShell脚本以批量更新C#项目中指定前缀的NuGet包版本

如何修改PowerShell脚本以批量更新C#项目中指定前缀的NuGet包版本

我完全懂你的痛点——原来的脚本是全局替换版本号,很容易误改那些和目标包同版本但名字不相关的包。现在我们要做的是精准定位包名以Utilities.开头的NuGet包,同时兼容两种常见的PackageReference格式,不管是分两行写的独立Version节点,还是把Version作为属性写在同一行的格式。

下面是修改后的PowerShell脚本,专门解决你的需求:

$targetDirectory = $args[0]
$packagePrefix = "Utilities."
$newVersion = $args[1]

# 遍历指定目录下所有子目录的.csproj文件
Get-ChildItem -Path $targetDirectory -Filter *.csproj -Recurse | ForEach-Object {
    $filePath = $_.FullName
    # 一次性读取整个文件内容,方便处理跨多行的XML结构
    $fileContent = Get-Content $filePath -Raw

    # 处理第一种格式:<PackageReference Include="Utilities.xxx"> 后跟单独的<Version>节点
    $fileContent = $fileContent -replace 
        "(<PackageReference Include=`"$packagePrefix[^`"]+`">[\s\S]*?<Version>)[^<]+(<\/Version>)",
        "`$1$newVersion`$2"

    # 处理第二种格式:<PackageReference Include="Utilities.xxx" Version="..." />
    $fileContent = $fileContent -replace 
        "(<PackageReference Include=`"$packagePrefix[^`"]+`" Version=`")[^`"]+(`" \/>)",
        "`$1$newVersion`$2"

    # 保存修改后的文件,指定UTF8编码避免乱码
    Set-Content -Path $filePath -Value $fileContent -Encoding UTF8
    Write-Host "已成功更新文件: $filePath"
}

脚本关键说明:

  • 精准匹配包名:不再依赖旧版本号搜索,而是直接锁定包名以Utilities.开头的PackageReference,彻底避免误改其他包。
  • 兼容两种格式:
    • 第一个正则处理分两行的XML结构:匹配到目标包的节点后,找到内部的Version子节点并替换版本值。
    • 第二个正则处理单行属性式写法:直接替换标签内的Version属性值。
  • 跨多行处理:用-Raw参数读取整个文件内容,不用担心换行导致的匹配失败问题。
  • 编码安全:保存时指定UTF8编码,避免修改后出现中文乱码或特殊字符异常。

使用方法:

把脚本保存为Update-UtilitiesPackages.ps1,然后在PowerShell中运行:

.\Update-UtilitiesPackages.ps1 "C:\你的项目根目录路径" "0.1.5.16-develop"

小提醒:

建议先备份项目文件,或者在测试环境先验证脚本效果,确保符合预期后再在正式项目中使用。

备注:内容来源于stack exchange,提问作者MB34

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 07:43:09