【问题标题】:What am I doing wrong on PowerShell function parameters?我在 PowerShell 函数参数上做错了什么?
【发布时间】:2018-12-31 17:01:49
【问题描述】:

如果有人能指出我在将参数 from 传递回主线代码时做错了什么,我将不胜感激。我有一个已在函数中成功提取的变量,但我似乎无法将其传递回主线代码

这是我正在使用的代码:

function get-field ($field, $heading) {
    $fieldPos = $script:source.AllElements.InnerText.IndexOf($heading) +1
    $field = $script:source.AllElements.InnerText[$fieldPos]    

    # If states "Not Available", or contains a heading, process as if not found.
    if ($field -eq "Not Available ") {$fieldPos = 0}
    if ($field -eq $heading) {$fieldPos = 0}

    # Check that a valid entry was received
    if ($fieldPos -eq 0) {
        Write-Host "Warning:" $heading "was not found" 
    } else {
        $field = $field.Trim()
    }

    return $field
}    

get-field $email "Name"
get-field $address "Address"

我已经验证在函数中,$field$heading 参数包含正确的信息,那么为什么没有填充 $email$address 字段?

【问题讨论】:

  • 能发一下功能代码吗?
  • 也许我没有完全理解这个函数,但你似乎没有在任何地方填充变量。您返回 $field 但在调用函数时不要将其保存在任何地方。不知道功能,$email = get-field $email "Name"解决问题了吗?

标签: function powershell parameter-passing


【解决方案1】:

你并没有完全错。

看看这个例子:

function get-field ($field, $heading) {

    return "$field - $heading"
}

$address = get-field "AddressFiled" "AddressHeading"
$address

要在变量中捕获返回值以供进一步使用,您应该像上面的示例一样调用函数。

【讨论】:

  • 谢谢。这让我发疯了;我需要做的就是在调用函数之前放置 $address =。感谢您的帮助!
【解决方案2】:

PowerShell 中的参数通常用于将值传递 一个函数。函数的输出必须分配给调用函数的语句中的变量。此外,在函数中使用全局变量也是一种糟糕的设计,因为这会使调试变得更加困难。

您的代码应该看起来有点像这样:

function Get-Field ($data, $heading) {
    $fieldPos = $data.IndexOf($heading) + 1
    $field    = $data[$fieldPos].Trim()

    # If states "Not Available", or contains a heading, process as if not found.
    if ($field -eq 'Not Available' -or $field -eq $heading) {
        Write-Host "Warning: ${heading} was not found" 
    }

    $field
}    

$email   = Get-Field $script:source.AllElements.InnerText 'Name'
$address = Get-Field $script:source.AllElements.InnerText 'Address'

如果您愿意,可以提供参数,但它们在 PowerShell 中相当少见,可能是因为它们不像人们想要的那样直接使用。

function Get-Field ([ref]$field, $data, $heading) {
    $fieldPos    = $data.IndexOf($heading) + 1
    $field.Value = $data[$fieldPos].Trim()

    # If states "Not Available", or contains a heading, process as if not found.
    if ($field -eq 'Not Available' -or $field -eq $heading) {
        Write-Host "Warning: ${heading} was not found" 
    }
}    

$email = $null
Get-Field ([ref]$email) $script:source.AllElements.InnerText 'Name'
$address = $null
Get-Field ([ref]$address) $script:source.AllElements.InnerText 'Address'

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2021-11-20
    • 2015-11-19
    相关资源
    最近更新 更多