2012-02-24 2 views
0

У меня есть Powershell скрипт со следующим кодом в нем ...Линия кода 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 

Когда я просто запустить этот скрипт в псе ISE, нагрузка конфигурация работает, потому что в конце сценария (я проверил это с точкой останова), но переменная $ configData остается пустой.

Но если я немедленно скопирую и миную строку $configData = Import-Clixml -path "$cfgPath" в командной строке powershell и запустим ее, тогда $ configData загружается данными. Есть ли у кого-нибудь идеи, что может произойти?

EDIT
Я думаю, что то, что вы говорите, что $ configData в $configData = Import-Clixml -path "$cfgPath" проходит лечение в целом отдельной переменной (и является локальной для функции) из обзорных правил. Я думал, что это будет больше похоже на класс C#, и поэтому будет присваиваться переменной уровня скрипта с тем же именем.

Я ЛЮБЛЮ силу, но динамическая типизация делает вещи сложнее.

EDIT 2
Оба ответа были проницательными. В таком случае я обычно даю ответ человеку с наименьшей репутацией. И во всяком случае, я сделал второй пример Энди.

Сет

ответ

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 

Примечание - Ваш ArrayList переопределены с помощью Import-Clixml и другого типа по возвращении.

Возвращает новое значение:

$cfgPath = 'C:\Test.xml' 
function Load-Config() 
{ 
    if (test-path ($cfgPath)) 
    { 
     $data = Import-Clixml -path "$cfgPath" 
     return $data 
    } 
} 
$configData = load-config 
4

Вы создаете новую переменную с именем $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" 
    } 
}