0

我有一个 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 in$configData = Import-Clixml -path "$cfgPath"由于范围规则而被视为一个完整的单独变量(并且是函数的本地变量)。我认为它更像 ac# 类,因此会分配给同名的脚本级变量。

我很喜欢 powershell,但动态类型确实让事情变得更棘手。

编辑 2
两个答案都很有见地。在这种情况下,我通常会向声誉最低的人提供答案。无论如何,我确实做了安迪的第二个例子。

赛斯

4

2 回答 2

4

您使用 name 创建新变量$configData。您有多种选择(取决于您的环境/脚本/...)

最明显的是 - 只需返回值并将其分配给配置数据

function Load-Config () 
{
    if (test-path ($cfgPath))
    {
        Import-Clixml -path "$cfgPath"
    } 
}
$configData = load-Config

您也可以像这样使用对象及其属性:

$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"
    } 
}
于 2012-02-24T22:13:10.057 回答
2

您对变量有范围界定问题$configData。当您在函数中设置它的值时,它在外部不可用。您可以使用范围修饰符来修复它或返回值。

退房get-help about_scopes或点击这里

范围修饰符:

$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

注意 - 您的 ArrayList 被使用覆盖,Import-Clixml并且在返回时是不同的类型。

返回新值:

$cfgPath = 'C:\Test.xml'
function Load-Config () 
{
    if (test-path ($cfgPath))
    {
        $data = Import-Clixml -path "$cfgPath"
        return $data
    }
}
$configData = load-config
于 2012-02-24T22:11:35.433 回答