【问题标题】:PowerShell passing two arrays by reference to a functionPowerShell 通过引用函数传递两个数组
【发布时间】:2015-04-02 03:50:46
【问题描述】:

目前我正在尝试通过引用我编写的将数据加载到这些数组中的函数来传入两个数组项。但是,一旦此函数失去作用域,数组就会显示为空白。

如果我使用 ref 关键字将它们传递给函数,则第一个数组会正确加载。但是,第二个数组给出了一个错误,说我不能在它上面使用 add 运算符。

$logConfigPath = "C:\Testing\Configuration\config.xml"

#### VARIABLES RELATING TO THE LOG FILE

# Contains the log path and log file mask
$logPaths = @()
$logFileMasks = @()

#### FUNCTION CALLS
LoadLogTailerConfig($logConfigPath, $logPaths, $logFileMasks)

"$logPaths"
"$logFileMasks"


function LoadLogTailerConfig($logConfigPath, $logPath, $logFileMasks)
{
    Write-Debug "Loading config file data from $logConfigPath"

    [xml]$configData = Get-Content "C:\Testing\Configuration\config.xml"

    foreach ($log in $configData.Logs.Log) {

        $logPaths += $log.FilePath
        $logFileMasks += $log.FileMask
    }
}

为什么这对我不起作用?

【问题讨论】:

标签: arrays powershell pass-by-reference


【解决方案1】:

我修改了你的例子来工作:

$logConfigPath = "C:\Testing\Configuration\config.xml"

#### VARIABLES RELATING TO THE LOG FILE

# Contains the log path and log file mask
$logPaths = @()
$logFileMasks = @()


function LoadLogTailerConfig($logConfigPath, [ref]$logPaths, [ref]$logFileMasks)
{
    Write-Debug "Loading config file data from $logConfigPath"

    #[xml]$configData = Get-Content "C:\Testing\Configuration\config.xml"

    foreach ($log in 1..10) {

        $logPaths.value += $log
        $logFileMasks.value += $log
    }
}

#### FUNCTION CALLS
LoadLogTailerConfig $logConfigPath ([ref]$logPaths) ([ref]$logFileMasks)

"$logPaths"
"$logFileMasks"

注意事项:

  • 在 PowerShell 中调用函数的不同语法
  • 你需要先定义你的函数,然后再调用而不是反过来
  • 确保使用正确的参数名称。您的函数接受$logPath,但随后它会尝试修改$logPaths - 当然这不会按预期工作,因为末尾有额外的s
  • 在函数定义和函数调用中都需要使用[ref]
  • 您需要通过将.value 添加到引用变量来访问引用值

也可以在这里参考几乎相同的先前问题:Powershell passing argument values to parameters and back

【讨论】:

  • Peter Mortensen,我不喜欢在要点结尾处使用句号。这是一个风格选择,不需要编辑它。谢谢!
【解决方案2】:

您抱怨的问题不是您的代码中的第一个问题。您正在使用函数LoadLogTrailerConfig,但未在使用前对其进行定义。所以,你必须先纠正这个失误。更正后,您的代码将在没有语法错误的情况下运行,但从逻辑上讲,它仍会出现不希望的输出,但解释会很简单:array 是一个不可变的引用对象.

【讨论】:

  • 该代码实际上包含在一个主函数中,我只是将其删除以使其更清晰和易于准备,因此它实际上运行良好,错误与我得到的输出有关来自keywords 变量和maxCounts。佳沛提供的代码有效
猜你喜欢
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2021-03-24
  • 2014-07-12
  • 2012-05-16
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多