Powershell代码行在通过函数调用时不会运行,但会直接运行。可能的原因是什么?

时间:2012-02-24 21:54:17

标签: powershell powershell-ise

我有一个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
这两个答案都很有见地。在这种情况下,我通常给出声誉最低的人的答案。事实上,无论如何我都是安迪的第二个例子。

赛斯

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