如何通过引用将字符串传递给父范围?
这不起作用,因为字符串不是可接受的“值”。
function Submit([ref]$firstName){
$firstName.value = $txtFirstName.Text
}
$firstName = $null
Submit([ref]$firstName)
$firstName
错误:“无法在该对象上找到属性'值;请确保它存在且可设置”
这样做不会产生错误,但也不会更改变量:
$firstName = "nothing"
function Submit([ref]$firstName){
$firstName = $txtFirstName.Text
}
Submit([ref]$firstName)
$firstName
单独执行第一个代码块是可行的。但是,当尝试在我的脚本中执行此操作时,它将再次返回错误。我对其进行了充分的修复,以使其可以分配变量并执行我想要的操作,但是它仍然引发错误,我想知道如何解决该问题。我认为这是因为它不喜欢变量;它在运行会话期间发生变化。这是我的脚本的链接
https://github.com/InconspicuousIntern/Form/blob/master/Form.ps1
答案 0 :(得分:1)
您的第一个代码段在概念上是正确的,并且可以按预期工作-它本身不会(不)产生“在此对象上找不到属性'值'”错误。< / p>
由于以下行,您仅在链接到的完整脚本中看到错误:
$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
内部绑定到(本地)参数变量 $firstName
(两个名称可能相同,但不一定,但最好不要具有相同的名称),然后可以使用$firstName.Value
来修改调用方的$firstName
变量。
语法注释:我故意在Submit
和([ref] $firstName)
之间放置一个空格,以使内容更清楚:
此处的(...)
(括号)不会将整个参数 list 括起来,就像在 method 调用中那样,它们将括起来参数 [ref] $firstName
-是必要的,因为否则表达式不会被这样识别。
函数调用以所谓的 argument模式进行解析,其语法更类似于调用控制台应用程序的语法:参数以空格分隔,并且通常仅如果它们包含特殊字符,则需要引用。
例如,如果您还想将字符串'foo'
作为第二个位置参数传递给Submit
:
Submit ([ref] $firstName) foo
请注意两个参数如何用空格分隔,以及foo
不需要用引号引起来。
关于替代方法:
[ref]
的主要目的是启用具有ref
/ out
参数的.NET方法调用,并且如上所述,使用[ref]
是很简单的。 / p>
对于调用PowerShell函数,通常有更简单的解决方案。
例如,您可以将自定义对象传递给函数,并让该函数使用要返回的值更新其属性,这自然允许多个值被“归还”;例如:
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'
答案 1 :(得分:0)
请尝试一下,看看是否得到相同的结果?它对我有用,我的确没有太大改变。
$txtFirstName = [PSCustomObject]@{
Text = "Something"
}
function Submit([ref]$var){
$var.value = $txtFirstName.Text
}
$firstName = $null
Submit([ref]$firstName)
$firstName