gpt4 book ai didi

powershell - PowerShell中具有函数作用域的变量(带有高级方法)?

转载 作者:行者123 更新时间:2023-12-02 23:28:14 25 4
gpt4 key购买 nike

有人可以告诉我我在这里想念的吗?

function Test-Cmdlet {
[CmdletBinding()]
Param (
[string] $Prepend,
[parameter(ValueFromPipeline=$true)] [string] $OtherString
)

BEGIN
{
if ($Prepend -eq $null) {
$Prepend = ".."
}
}

PROCESS
{
write-host ($Prepend + $OtherString)
}
}

# success:
PS> @( "ab", "cd" ) | Test-Cmdlet "-"
-ab
-cd

# failure:
PS> @( "ab", "cd" ) | Test-Cmdlet
ab
cd

# should be:
..ab
..cd

为什么未设置$ Prepend?

我试过在BEGIN / PROCESS块之外声明变量,但是解释器不接受。

我尝试使用: Set-Variable -Name "Prepend" -Value ".." -Scope 1(以及范围0和范围2),而不是: $Prepend = "..",但仍然无效。

我熟悉 $global:Variable,但是知道如何使用高级方法在cmdlet中获取函数范围的变量吗?

编辑:

如下所示,解决方案是:

function Test-Cmdlet {
[CmdletBinding()]
Param (
[string] $Prepend,
[parameter(ValueFromPipeline=$true)] [string] $OtherString
)

BEGIN
{
$_prepend = $Prepend

if (!$Prepend) {
$_prepend = ".."
}
}

PROCESS
{
write-host ($_prepend + $OtherString)
}
}

最佳答案

我必须假设您为此使用Powershell 2.0。在该版本中,当您在Begin块中设置参数的值时,它将不会在ProcessEnd块中保留该值。

在Powershell 3.0+中已对此进行了更改。

对于v2.0,为非参数变量分配参数的值,并在所有3个块中使用该值:

function Test-Cmdlet {
[CmdletBinding()]
Param (
[string] $Prepend,
[parameter(ValueFromPipeline=$true)] [string] $OtherString
)

BEGIN
{
if ($Prepend -eq $null) {
$doPrepend = ".."
} else {
$doPrepend = $Prepend
}
}

PROCESS
{
write-host ($doPrepend + $OtherString)
}
}

关于powershell - PowerShell中具有函数作用域的变量(带有高级方法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27072117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com