在 Powershell 中通过引用传递字符串?

Pass strings by reference in Powershell?

如何通过对父作用域的引用来传递字符串?

这不起作用,因为不接受字符串 "values"。

function Submit([ref]$firstName){ 
    $firstName.value =  $txtFirstName.Text 
}

$firstName = $null
Submit([ref]$firstName)
$firstName

错误: "Property 'value' cannot be found on this object; make sure it exists and is settable"

这样做不会出错,但也不会更改变量:

$firstName = "nothing"

function Submit([ref]$firstName){ 
    $firstName =  $txtFirstName.Text 
} 

Submit([ref]$firstName)
$firstName

编辑:

自己做第一个代码块是可行的。但是,当尝试在我的脚本中执行此操作时,它再次出现 returns 错误。我对其进行了足够的修复,使其能够分配变量并执行我想要的操作,但它仍然会抛出一个错误,我想知道如何修复它。我认为这是因为它不喜欢变量;es 在 运行 会话期间发生变化。这是我的脚本link

https://github.com/InconspicuousIntern/Form/blob/master/Form.ps1

请试一试,看看是否得到相同的结果?它对我有用,我真的没有太大改变。

$txtFirstName = [PSCustomObject]@{
    Text = "Something"
}

function Submit([ref]$var){ 
    $var.value =  $txtFirstName.Text 
}



$firstName = $null
Submit([ref]$firstName)
$firstName

您的第一个代码段在概念上是正确的并且按预期工作 - 它本身不会产生"Property 'Value' cannot be found on this object"错误。

由于以下行,您看到的错误仅作为您 link 的完整脚本的一部分:

$btnSubmit.Add_Click({ Submit })

此行导致 Submit 函数在没有参数的情况下被调用 ,这又导致 $firstName 参数值为 $null ,当您分配给 $firstName.Value.

时,这又会导致上面引用的错误

相比之下,以下对 Submit 的调用是正确的:

Submit ([ref] $firstName)  # Note the recommended space after 'Submit' - see below.

[ref] $firstName 创建对调用者 $firstName 变量 的(瞬时)引用,它在 Submit 内绑定到(本地)parameter variable $firstName(两者可以,但不必,最好不要同名),其中$firstName.Value然后可以用来修改调用者的$firstName变量。


语法说明:我特意在 Submit([ref] $firstName) 之间放置了一个 space 以使一件事更清楚:

此处的 (...)(圆括号)并未包含整个参数 list,就像在 method 调用中一样,它们包含 单个参数 [ref] $firstName - 必要的,因为 表达式 否则不会被识别。

PowerShell 中的函数调用在所谓的参数模式 中进行解析,其语法更像是调用控制台应用程序的语法:参数是space-分隔,一般只在含有特殊字符时才需要引号。

例如,如果您还想将字符串 'foo' 作为第二个位置参数传递给 Submit:

Submit ([ref] $firstName) foo

请注意两个参数是如何 space 分隔的以及 foo 不需要被引用的方式。


至于替代方法

[ref] 的主要目的是启用具有 ref / out 参数的 .NET 方法调用,并且如上所示,使用 [ref] 非常重要.

对于 PowerShell 函数的调用,通常有更简单的解决方案。

例如,您可以将 自定义对象 传递给您的函数,让函数使用您想要 return 的值更新其属性,这自然允许 多个个值是"returned";例如:

function Submit($outObj){ 
    $outObj.firstName = 'a first name'
}

# Initialize the custom object that will receive values inside
# the Submit function.
$obj = [pscustomobject] @{ firstName = $null }

# Pass the custom object to Submit.
# Since a custom object is a reference type, a *reference* to it
# is bound to the $outObj parameter variable.
Submit $obj

$obj.firstName # -> 'a first name'

或者,您可以让 Submit 构造自定义对象本身,然后简单地 输出 它:

function Submit { 
    # Construct and (implicitly) output a custom
    # object with all values of interest.
    [pscustomobject] @{ 
        firstName = 'a first name' 
    } 
}

$obj = Submit

$obj.firstName # -> 'a first name'