在PowerShell中新增了许多Perference Variable,今天要特别介绍的是标题中提到的$PSDefaultParameterValues变量。
顾名思义该变量的作用就像名字中看到的那样,可以用来作为默认的参数值,预先设置好默认参数值,在特定的环境中或者测试中显得尤为方便,下面让我们看看如何使用。
常用的语法大致有如下两种:
$PSDefaultParameterValues=@{"<CmdletName>:<ParameterName>"="<DefaultValue>"}
$PSDefaultParameterValues=@{"<CmdletName>:<ParameterName>"={<ScriptBlock>}}
如下,我们试着给Get-Process命令设置一个Name默认参数值。
$PSDefaultParameterValues = @{"Get-Process:Name"="Notepad"}
我们可以看到,当设置好默认参数值后,当你再次运行Get-Process的时候将出现预先设置好的参数值,也就是直接得出了你想要的筛选结果。
当然你也可以同时设定多个参数值,只需要以 “;” 分隔。
如何使用脚本块设定预先值
接下来,再来让我们看看它是如何支持脚本块预先参数设定的。
以脚本块模式设定参数值其实很简单,只需要按照表达式 @{"<CmdletName>:<ParameterName>"={<ScriptBlock>}} 将语句块的内容替换<ScriptBlock>就行,不过细心的朋友会发现我们在如上图的例子中却多了一对{}大括号,这是为什么呢? 其实很好理解,因为我们的例子中,所用的的命令是Invoke-Command, 而该命令对于参数 -ScriptBlock的用法为:Invoke-Command -ScirptBlock {Get-Process}, 所以正确的方式,理应是把“{Get-Process}” 替换到<ScriptBlock>上。
添加一个值到$PSDefaultParameterValues
大家在测试中一定会发现,当我们在进行多个预先值设定后,在输出$PSDefaultParameterValues时会发现,先前的设定都被覆盖了。尽管我们可以通过之前讲到的";"分号来进行大批量的针对不同命令的预先值设定,但是一旦进行下一次命令设定时系统就会把上一次的操作给覆盖掉,有什么办法吗? 当然有,我们可以使用Add()方法,如下图所以:
以哈希表的凡是添加值即可。
<HashTable>.Add(Key, Value)
删除$PSDefaultParameterValues中的值
理所当然,有Add方法也自然有Remove方法,Remove方法删除值的时候,只需要键入欲删除的参数名即可,如下图所示:
最后我们要说一个尤其有趣又重要的一点。有一种情况,当用户想要设置另一种环境,但是又不想抹去先前设定 大批量 设定值,那该如何是好?很简单$PSDefaultParameterValues在这里考虑到了这点,我们可以临时将他禁用起来,当你希望的时候在打开,看看下面吧:
当我们设置为Disable后,当再次运行Invoke-Command,则变回以往正常模式中那样提示你输入参数值了。