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

このスクリプトをpsISEで実行すると、load-configが実行されます。これは、スクリプトの最後にあるためです(ブレークポイントでこれを確認しました)が、$configData変数は空のままです。

しかし、すぐにその行をコピー$configData = Import-Clixml -path "$cfgPath"してPowerShellコマンドラインに貼り付けて実行すると、$configDataにデータが読み込まれます。誰かが何が起こっているのか考えていますか?

編集
あなたが言っている$configData = Import-Clixml -path "$cfgPath"のは、スコープ規則のために、inの$ configDataは完全に別個の変数として扱われている(そして関数に対してローカルである)ということだと思います。ac#クラスに似ているので、同じ名前のスクリプトレベルの変数に割り当てると思いました。

私はPowerShellが大好きですが、動的型付けは物事を難しくします。

編集2
両方の答えは洞察に満ちていました。そのような場合、私は通常、評判が最も低い人に答えを出します。そして、私は実際、どのような場合でもアンディの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

variable にスコープの問題があります$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 に答える