2017-02-02 5 views
0

У меня есть скрипт с параметрами. Чтобы облегчить отладку скрипта, я создаю небольшую функцию, которую я нашел в сети, чтобы перечислить все мои переменные. Для этого я начинаю с получения всех существующих переменных в верхней части скрипта, затем создаю функцию, которая сравнивает записанные переменные до и после получения параметровОбъявление параметров не работает, если что-то выше параметра

Проблема заключается в том, что я положил $AutomaticVariables и функцию до param Объявление PowerShell дает мне следующую ошибку для любого параметра, где я устанавливаю значение по умолчанию. Есть ли способ обхода этого   & hellip; ошибка? Если это не ошибка, почему, черт возьми, это поведение. Я не вижу смысла.

Выражение присваивания недействительно. Ввод оператора присваивания должен быть объектом, который может принимать назначения, такие как переменная или свойство.

# Array and function to debug script variable content 
$AutomaticVariables = Get-Variable 

function check_variables { 
    Compare-Object (Get-Variable) $AutomaticVariables -Property Name -PassThru | 
    Where -Property Name -ne "AutomaticVariables" 
} 

param(
    [String]$hostname, 
    [String]$jobdesc, 
    [String]$type = "standard", 
    [String]$repo, 
    [String]$ocred, 
    [String]$site, 
    [String]$cred = "SRC-$($site)-adm", 
    [String]$sitetype, 
    [String]$room, 
    [String]$chsite = "chub" 
) 

# TEST - Display variables 
check_variables 
+0

Должен ли я сказать, что даже если Я ставлю простое объявление переменной так же глупо, как x = 1 до param, поведение остается прежним. Таким образом, это не связано с Get-Variable или с функцией. Все, что перед параметром, дает тот же результат. –

+2

Это не ошибка, именно так разработан язык, чтобы облегчить жизнь тем, кто пишет парсер. –

+0

Как обрабатывать переменные, которые я хочу задать перед параметрами? Я попытался добавить параметры Get-Variable Inside, но он содержит все остальные переменные параметра. Кажется, он не установлен в порядке. –

ответ

0

Это не ошибка. Параметр param определяет входной параметр вашего скрипта, поэтому должен быть первым утверждением (таким же, как с функциями). Существует нет необходимости выполнять какие-либо действия перед блоком параметров.

Если вы объясните, что вы хотите достичь, с помощью вашего check_variables (не то, что он делает). Вероятно, мы можем показать вам, как это сделать правильно.

+0

Моя цель - просто перечислить содержимое переменных, чтобы увидеть, что это такое. Как и Get-Variable, но без автоматических переменных –

2

Как уже упоминалось в комментариях, вы должны собрать переменные, которые вы хотите исключить в вызывающем сферу:

Определение функции (может также быть сценарий), обратите внимание на параметр $DebugFunc я добавил в конце :

function Do-Stuff 
{ 
    param(
     [String]$hostname, 
     [String]$jobdesc, 
     [String]$type = "standard", 
     [String]$repo, 
     [String]$ocred, 
     [String]$site, 
     [String]$cred = "SRC-$($site)-adm", 
     [String]$sitetype, 
     [String]$room, 
     [String]$chsite = "chub", 
     [scriptblock]$DebugFunc 
    ) 

    if($PSBoundParameters.ContainsKey('DebugFunc')){ 
     . $DebugFunc 
    } 
} 

Теперь собрать переменные и определить свою функцию, а затем вводят его в Do-Stuff:

# Array and function to debug script variable content 
$AutomaticVariables = Get-Variable 
function check_variables { 
    Compare-Object (Get-Variable) $AutomaticVariables -Property Name -PassThru | Where -Property Name -ne "AutomaticVariables" 
} 

Do-Stuff -DebugFunc $Function:check_variables