PowerShell通过引用函数传递两个数组

时间:2015-02-03 03:00:24

标签: arrays powershell pass-by-reference

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

如果我使用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
    }
}

为什么这对我不起作用?

2 个答案:

答案 0 :(得分:5)

我修改了你的例子:

$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

答案 1 :(得分:0)

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