Строка кода Powershell не запускается при вызове через функцию, но запускается напрямую.Какие могут быть возможные причины? - PullRequest
0 голосов
/ 25 февраля 2012

У меня есть скрипт 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

Когда я просто запускаю этот скрипт в PSE ISE, запускается load-config, потому что он находится в конце скрипта (я проверил это с точкой останова), но переменная $ configData остается пустой.

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

РЕДАКТИРОВАТЬ
Я думаю, что вы говорите, что $ configData в $configData = Import-Clixml -path "$cfgPath" обрабатывается как отдельная переменная (и является локальной для функции) из-за области видимостиправила.Я думал, что это будет больше похоже на класс AC # и поэтому присвоит переменной уровня сценария с тем же именем.

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

РЕДАКТИРОВАТЬ 2
Оба ответа были проницательными.В таком случае я обычно даю ответ человеку с наименьшей репутацией.И я сделал на самом деле второй пример Энди в любом случае.

Сет

Ответы [ 2 ]

4 голосов
/ 25 февраля 2012

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

function Load-Config () 
{
    if (test-path ($cfgPath))
    {
        $script:configData = Import-Clixml -path "$cfgPath"
    } 
}
2 голосов
/ 25 февраля 2012

У вас проблема с областью видимости с переменной $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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...