【问题标题】:Open XML, modify and save again打开XML,修改再保存
【发布时间】:2015-11-30 12:15:57
【问题描述】:

我有一个构建脚本来修改一些曾经可以工作的 Nuget *.nuspec 依赖版本 - 但不知何故它不再起作用了。不知道是因为我更新到 Windows 10 还是 Powershell 版本改变了。

Function ChangeNugetSpecDependencyVersion() {

    Param(
        [Parameter(Mandatory=$true)]
        [string]$filePath,
        [Parameter(Mandatory=$true)]
        [string]$packageId,
        [Parameter(Mandatory=$true)]
        [string]$publishVersion
    )

    [xml] $toFile = (Get-Content $filePath)

    $nodes = $toFile.SelectNodes("//package/metadata/dependencies/dependency[starts-with(@id, $packageId)]")
    if ($nodes) {
        foreach ($node in $nodes) {
            $nodeId = $node.id
            Write-Host "-- Updating '$nodeId' in '$filePath' to version '$publishVersion'"
            $node.version = "[" + $publishVersion +"]"
            $toFile.Save($filePath)
        }
   }
}

# Version
$version = "2.0.0.0" 

# Assemblies
$assemblies = "NerveFramework", "NerveFramework.EntityFramework"

# Change dependency version on all depending assemblies
Write-Host "Changing the NuGet Spec version dependencies to '$version'..."
$nuspecFiles = Get-ChildItem $assemblies -Filter "NerveFramework*.nuspec" -Recurse | Resolve-Path -Relative
foreach ($nuspecFile in $nuspecFiles) {
    ChangeNugetSpecDependencyVersion $nuspecFile "NerveFramework" $version
} 

错误是$toFile.Save($filePath),它说:

使用“1”参数调用“保存”的异常:“En del af stien 'C:\Users\Jan\NerveFramework.EntityFramework\NerveFramework.EntityFramework.nuspec' blev ikke fundet。”在 C:\GitHub\nerve-framework\BuildFunctions.ps1:58 字符:13 + $toFile.Save($filePath) + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException

对不起,部分丹麦语,但它说它找不到部分路径。

这里有一件事是这条路径:C:\Users\Jan\NerveFramework.EntityFramework\NerveFramework.EntityFramework.nuspec 是错误的。

文件位置相对于执行命令的文件:C:\GitHub\nerve-framework\NerveFramework.EntityFramework\NerveFramework.EntityFramework.nuspec

但是它可以打开文件,但是为什么保存功能提供了错误的路径?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    你为什么要使用Resolve-Path?您应该将完整路径传递给 ChangeNugetSpecDepdencyVersion 函数:

    此外,在函数中,您调用 $toFile.Save($filePath) foreach 节点 - 而不是仅一次(最后)。

    最后一个节点:您应该使用approved verbs 来表示Update-NugetSpecDependyVersion 之类的函数,并省略结尾的()。示例:

    Function Update-NugetSpecDependencyVersion 
    {
        Param
        (
            [Parameter(Mandatory=$true)]
            [string]$filePath,
            [Parameter(Mandatory=$true)]
            [string]$packageId,
            [Parameter(Mandatory=$true)]
            [string]$publishVersion
        )
    
        [xml] $toFile = (Get-Content $filePath)
    
        $nodes = $toFile.SelectNodes("//package/metadata/dependencies/dependency[starts-with(@id, $packageId)]")
        foreach ($node in $nodes) 
        {
            Write-Host ("-- Updating '{0}' in '{1}' to version '{2}'" -f $node.id, $filePath, $publishVersion)
            $node.version = "[{0}]" -f $publishVersion
        }
    
        $toFile.Save($filePath)
    
    }
    
    # Version
    $version = "2.0.0.0" 
    
    # Assemblies
    $assemblies = "NerveFramework", "NerveFramework.EntityFramework"
    
    # Change dependency version on all depending assemblies
    Write-Host "Changing the NuGet Spec version dependencies to '$version'..."
    Get-ChildItem $assemblies -Filter "NerveFramework*.nuspec" -Recurse | 
            % { Update-NugetSpecDependencyVersion $_.FullName "NerveFramework" $version }
    

    【讨论】:

    • 这样我得到了这个错误:gist.github.com/janhartmann/0b1de4d49b5859e794ed
    • 好东西,现在可以工作了——将重写我的其他函数以使用相同的语法。谢谢大佬!
    • 欢迎您!您还应该尝试最小化 Write-Host ;-)
    • 怎么回事?我需要控制台窗口的一些输出吗? :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2018-07-04
    • 2023-01-20
    • 2021-09-08
    • 2014-06-09
    相关资源
    最近更新 更多