在 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'
如何通过对父作用域的引用来传递字符串?
这不起作用,因为不接受字符串 "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'