PowerShell 通过引用函数传递两个数组
PowerShell passing two arrays by reference to a function
目前我正在尝试通过引用我编写的函数来传递两个数组项,该函数将数据加载到这些数组中。但是,一旦此函数失去作用域,数组就会显示为空白。
如果我使用 ref 关键字将它们传递到函数中,第一个数组会正确加载。然而,第二个数组给出了一个错误,说我不能在上面使用添加运算符。
$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
}
}
为什么这对我不起作用?
我修改了你的例子来工作:
$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
您抱怨的问题不是您代码中的第一个问题。您正在使用函数 LoadLogTrailerConfig
而未在使用前对其进行定义。所以,你必须先纠正这个错误。更正后,您的代码将 运行 没有语法错误,但逻辑上它仍然会出现不需要的输出,但解释会很简单: array is an imutable reference对象.
目前我正在尝试通过引用我编写的函数来传递两个数组项,该函数将数据加载到这些数组中。但是,一旦此函数失去作用域,数组就会显示为空白。
如果我使用 ref 关键字将它们传递到函数中,第一个数组会正确加载。然而,第二个数组给出了一个错误,说我不能在上面使用添加运算符。
$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
}
}
为什么这对我不起作用?
我修改了你的例子来工作:
$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
您抱怨的问题不是您代码中的第一个问题。您正在使用函数 LoadLogTrailerConfig
而未在使用前对其进行定义。所以,你必须先纠正这个错误。更正后,您的代码将 运行 没有语法错误,但逻辑上它仍然会出现不需要的输出,但解释会很简单: array is an imutable reference对象.