如何将一个函数的输出传递给PowerShell中的另一个函数?

时间:2014-12-08 09:29:00

标签: powershell wix powershell-v3.0 pipeline

我正在尝试为我的wix项目设置一个新的guid。我想通过使用流水线函数来实现这一点。

我写了以下函数

Function GetGUIDFrom-Wix {

    [CmdletBinding()]
    [OutputType([string])]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0)]
        [ValidateScript({Test-Path $_ })]
        [string] $Path


    )

    Begin
    {
        $xmldata = New-Object XML

        $xmldata.Load($Path)
    }
    Process
    {
        $Guid = $xmldata.Wix.Product.Id
    }
    End { Write-Output $Guid }

}

Function SetGUIDTo-Wix {

    [CmdletBinding()]
    [OutputType([string])]
    Param (
         [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$false,                
                   Position=0)]
        [ValidateScript({Test-Path $_ })]
        [string] $Path,
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=1)]
        [string] $Guid

    )

    Begin
    {
        $xmldata = New-Object XML

        $xmldata.Load($Path)
    }
    Process
    {
        If ($Guid -eq  $xmldata.Wix.Product.Id ) {



            $NewGuid = [string] $NewGuid = [string] [guid]::newguid().tostring().toUpper()

            $xmldata.Wix.Product.Id = $NewGuid

        }
        Else { 
            Write-Error "Guid is not matching. Can't set new guid" 
        }
    }
    End {  

        $xmldata.Save($Path)
        return $NewGuid 
    }

}

我认为功能GetGUIDFrom-Wix将返回guid到管道,SetGUIDTo-Wix将接收流水线guid并将其设置在文件中。

以下是我的函数调用

$Path = E:\MyWixproj.wxs
GetGuidFrom-Wix -Path $Path | SetGuidTo-Wix -Path $Path -guid $_

但结果说

  

SetGUIDTo-Wix:无法将参数绑定到参数'Guid',因为它是   一个空字符串。

如果我只是执行GetGUIDFrom-Wix -Path $ Path | Out-File c:\ test.txt,它将GUID值返回给文件。我们不能将输出作为管道发送到另一个自定义函数吗?

2 个答案:

答案 0 :(得分:2)

有几个问题:

注意ValueFromPipeline而不是ValueFromPipelinebyPropertyName

Function GetGUIDFrom-Wix {

    [CmdletBinding()]
    [OutputType([string])]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory=$true,
               ValueFromPipeline=$True,
               Position=0)]
        [ValidateScript({Test-Path $_ })]
        [string] $Path
)

同样适用于函数SetGUIDTo-Wix

Function SetGUIDTo-Wix {

    [CmdletBinding()]
    [OutputType([string])]
    Param (
     [Parameter(Mandatory=$true,
               ValueFromPipeline=$false,
               Position=0
               )]
    [ValidateScript({Test-Path $_ })]
    [string] $Path,
    [Parameter(Mandatory=$true,
               ValueFromPipeline=$True,
               Position=1
               )]
    [string] $Guid

    )

GetGuidFrom-Wix -Path $Path  | SetGuidTo-Wix -Path $Path

答案 1 :(得分:1)

这里的问题是您将数组传递给SetGUIDTo-Wix而不是对象。

我看到你正在使用ValueFromPipelineByPropertyName,它通过流水线对象查找具有该名称的任何属性 - 因为数组没有格式良好的属性(只是一组值),它&# 39;无法从中分配任何东西。

有两种方法可以快速纠正 -
1.确保GetGUIDFrom-WIX正在返回具有GUID属性或
的对象 2.使用ValueFromPipeline,而不是ValueFromPipelineByPropertyName。