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

时间:2018-06-28 20:04:39

标签: function powershell parameter-passing pass-by-reference powershell-v3.0

如何通过引用将字符串传递给父范围?

这不起作用,因为字符串不是可接受的“值”。

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

2 个答案:

答案 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-是必要的,因为否则表达式不会被这样识别。

PowerShell中的

函数调用以所谓的 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