如果任何内容超出参数

时间:2017-02-02 10:09:45

标签: function powershell variables parameters

我有一个带参数的脚本。为了简化脚本的调试,我创建了一个我在网上找到的小函数来列出我的所有变量。为了做到这一点,我首先将所有现有变量放在脚本的顶部,然后创建一个函数来比较获取参数之前和之后记录的变量

问题是当我在$AutomaticVariables声明之前放置param和函数时,PowerShell为我设置默认值的任何参数给出了以下错误。反正有办法解决这个......错误?如果它不是一个bug,为什么地狱这个行为。我没有看到这一点。

  

赋值表达式无效。赋值运算符的输入必须是能够接受赋值的对象,例如a   变量或属性。

# 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这不是一个错误。 param 部分定义了脚本的输入参数,因此必须是第一个语句(与函数相同)。 无需在参数块之前执行任何操作。

如果你用check_variables解释你想要实现的目标(而不是它的作用)。我们可能会告诉你如何正确地做到这一点。