我有一个PowerShell脚本,其中包含以下代码......
$appdir = Split-Path -Path $MyInvocation.MyCommand.Path
$xfrdir = $appdir + "\xfr\"
$cfgFile = "ofx_config.cfg"
$cfgPath = $appdir + "\" + $cfgFile
$configData = New-Object System.Collections.ArrayList
# --- some other code here...
function Load-Config ()
{
if (test-path ($cfgPath))
{
$configData = Import-Clixml -path "$cfgPath"
}
}
# ---some other code here
load-config
当我在ps ISE中运行此脚本时,load-config会运行,因为它位于脚本的末尾(我用断点验证了这一点)但$ configData变量仍为空。
但是如果我立即将行$configData = Import-Clixml -path "$cfgPath"
复制并移到powershell命令行并运行它,那么$ configData将加载数据。有没有人有任何想法可能会发生什么?
修改
我认为你所说的是因为范围规则,$configData = Import-Clixml -path "$cfgPath"
中的$ configData被视为一个完整的单独变量(并且是函数的本地变量)。我认为它更像是一个c#类,因此将分配给同名的脚本级变量。
我喜欢PowerShell,但动态打字确实让事情变得棘手。
编辑2
这两个答案都很有见地。在这种情况下,我通常给出声誉最低的人的答案。事实上,无论如何我都是安迪的第二个例子。
赛斯
答案 0 :(得分:4)
您创建名为$configData
的新变量。您有几种选择(取决于您的环境/脚本/...)
最明显的是 - 只返回值并将其分配给配置数据
function Load-Config ()
{
if (test-path ($cfgPath))
{
Import-Clixml -path "$cfgPath"
}
}
$configData = load-Config
你也可以像这样使用object及其属性:
$configData = @{Data = $null}
function Load-Config ()
{
if (test-path ($cfgPath))
{
$configData.Data = Import-Clixml -path "$cfgPath"
}
}
或者可以使用script:
范围:
function Load-Config ()
{
if (test-path ($cfgPath))
{
$script:configData = Import-Clixml -path "$cfgPath"
}
}
答案 1 :(得分:2)
您有变量$configData
的范围问题。当您在函数中设置它的值时,它在外面不可用。您可以使用范围修饰符来修复它或返回值。
结帐get-help about_scopes
或点击here。
范围修饰符:
$cfgPath = 'C:\Test.xml'
$script:configData = New-Object System.Collections.ArrayList
function Load-Config ()
{
if (test-path ($cfgPath))
{
$script:configData = Import-Clixml -path "$cfgPath"
}
}
load-config
$configData
注意 - 使用Import-Clixml
覆盖您的ArrayList,并在返回时使用不同的类型。
返回新值:
$cfgPath = 'C:\Test.xml'
function Load-Config ()
{
if (test-path ($cfgPath))
{
$data = Import-Clixml -path "$cfgPath"
return $data
}
}
$configData = load-config