我正在尝试为我的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值返回给文件。我们不能将输出作为管道发送到另一个自定义函数吗?
答案 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。