在PowerShell 执行环境中有部分命令支持高级参数,什么是高级参数呢?其实高级参数就是PowerShell命令中除了可以引用的基本参数之外,额外可以提供其他功能的高级参数。通常进行以New、Set、Remove、Update为动词的命令支持这些参数,这些高级参数各有各的用处,各有各的特点。以下为所有的Cmdlet支持的高级参数,大家可以依据自己需要选择可用的高级参数。
· Verbose:显示命令执行的详细信息。
· Debug:显示命令执行过程中的Debug信息。
· ErrorAction:指定命令出现错误后的处理方式。
· ErrorVariable:重新定向错误信息到变量。
· InformationAction:在命令输出相应的信息后的处理方法。
· InformationVariable:记录命令输出的信息到参数中。
· OutVariable:将执行结果在传递到管道符的同时输出到参数。
· OutBuffer:定义结果每次输出到管道符右边的数量。
· PipelineVariable:在管道符中进行数据传递的过程中同时保存为变量。
· WarningAction:在命令出现警告时的处理方式。
· WarningVariable:重新定义警告信息到变量。
· Whatif:实现命令的模拟执行。
· Confirm:在需要再次确认的过程中确定是否再次确认。
相信刚看到这些高级参数一定会比较蒙,别着急,我们讲解部分命令的使用方法和功能。
在Cmdlet执行过程中如果希望了解命令详细的执行过程,可以在命令中开启Switch参数的Verbose选项。这里的Verbose显示的信息,是在函数执行过程中通过Write-Verbose写入的相关信息,在命令执行过程中如果没有写入任何的Verbose信息,则执行过程中没有反馈信息,当我们执行Get-ChildItem-Verbose,则无任何特别的详细信息输出,详细操作如图4.19所示。
在有Verbose参数的命令执行过程中,使用Verbose参数能够显示出命令执行过程中的Write-Verbose写入的信息。下面我们以如下命令分享执行过程,下面的命令写入了操作详细信息,具体的反馈信息如图4.20所示。
图4.19 无Verbose信息输出
图4.20 有Verbose信息输出
在默认的PowerShell执行环境中,Debug首选项被设置为Silent Continue,也就是执行过程中不会输出任何Debug信息。但是我们可以在命令执行过程中使用Switch类型的Debug参数,开启调试之后,在命令中写入的Write-Debug信息得到的结果可以实现调试信息的输出,具体操作如图4.21所示。
图4.21 Debug调试日志输出
这里需要注意的是,当前所有Debug日志输出的信息全部都是通过Write-Debug信息写出来的,如果本身在默认的命令和脚本中没有相应的调试输出信息,将不会输出任何信息。如果命令中有较多的Debug信息提供,则非常有代表性。图4.22所示为Debug信息开启后的状态,其中只要涉及调试信息,输出的结果都会停下来等待进一步操作。
图4.22 命令开启Debug后的信息状态
ErrorAction参数是用来指定命令或脚本执行出现错误后的操作,在PowerShell环境默认存在ErrorActionPreference参数来定义当前命令或脚本出现错误后的操作。这个操作是当前的PowerShell的全局设定,我们可以在命令行中使用ErrorAction 参数覆盖PowerShell 默认的ErrorActionPreference参数,让命令能够执行当前的操作,以当前执行的命令提供的执行参数为准。通常来说,ErrorAction参数提供了以下操作。
· Continue:继续执行,错误信息将被加入$Error变量。
· Ignore:忽略错误并且继续执行,在$Error变量中不会有错误信息记录。
· Inquire:出现错误后会询问是否继续执行,错误信息被加入$Error变量。
· SilentContinue:执行错误不会停止执行,也不会显示错误,错误信息被放入$Error变量。
· Stop:出现错误立即停止执行,不会继续执行其他代码。
这里的ErrorAction究竟是什么样子的操作呢?我们以一个案例来分析下ErrorAction的参数定义和命令执行,默认情况下$ErrorActionPreference的参数值为如图4.23的Continue。当参数设置为Continue则会出现错误后报错,并且能够继续执行当前脚本。也就是出现错误后报错,并且继续执行。
图4.23 $ErrorActionPreference 设置
接下来我们在PowerShell ISE界面中执行如下的代码,目前ErrorActionPrefrence 的参数设置为Continue,由于d:\log目录不存在,命令将持续执行并且会报出错误信息,如图4.24所示。
图4.24 出错后有报错信息但是继续执行
在默认执行策略条件下,我们对命令做一些小修改,在命令执行过程中引用ErrorAction参数并且设置为SilentContinue。在同样的条件下执行命令来看下结果,图4.25所示为命令执行后的结果,这里并没有出现任何错误提示。
图4.25 有错误处理和没有错误处理命令执行后对比结果
对比下两条命令的执行情况,第一个使用了ErrorAction的命令定义静默执行,命令即使出现错误,也不会出现任何提示。第二个命令没有使用ErrorAction参数重新指定错误后的操作处理,出现错误后立即显示错误信息。这里可以非常明显地看到两条命令执行的差别,但是两条命令的相同点在于都将错误变量的内容写入了$Error变量中。
在PowerShell的命令执行过程中一旦出现错误,所有的错误都会被写入$Error 变量中,久而久之,这个变量存储的信息将是惊人得大,有时候为了解决问题或者进行错误的Debug,就希望命令出现错误的时候能够将错误内容输出到我们定义的变量。当前支持的变量输出的方式有以下两种。
· 以覆盖的方式输出错误到变量。
· 以累加的方式输出错误到变量。
这里同样以上面的案例为例,d:\log 不存在,在目录下创建文件基本上一定会出错,输出错误信息到自定义的错误变量,最近的命令执行错误的信息将会保存在如图4.26所示的自定义错误变量中。
图4.26 自定义错误变量信息保存
这时候如果希望将命令执行错误的信息以累加的方式保存到错误变量中,需要在变量之前加入“+”。只要当前PowerShell Session没有结束,所有的错误信息将会被累加输出到当前PowerShell自定义错误变量中。错误信息结果如图4.27所示。
图4.27 以累加的方式显示错误信息记录
OutVariable 的功能与Tee-Object功能类似,它的作用是将当前的命令执行结果输出到定义的变量中,在命令结果传到管道的同时将结果保存到PowerShell 变量中。下面的命令就是将执行文件删除之前,将所有的文件保存到变量filelist中,如果希望知道删除的具体的文件,可以输入如图4.28的变量获取结果。
图4.28 获取删除文件列表
在PowerShell中OutBuffer使用的场景比较少,Outbuffer属性主要用来限制每次管道符传递的对象数量。默认条件下,Outbuffer一次传递一个对象到管道符右边的变量。但如果希望一次传递两个数据,可以设定OutBuffer参数值为1。
接下来我们以一个案例说明OutBuffer参数的使用,由于使用的场景不多,大家可以找一些相关的资料了解下这个参数的使用。
为什么执行的结果如图4.29所示?相信你会有所疑惑,原因就是这里一次传递的数据有两个。
图4.29 使用OutBuffer之后数据输出结果
PipeLineVariable和OutVariable提供的功能差不多,但是PipeLineVariable 提供的是管道符的中间变量。可以通过以下PowerShell脚本来熟悉PipeLineVariable的使用场景和使用方法。
在这个案例中有两个参数,Left参数值是左边管道符传递过来的1~10的数值,而Right 是在管道符右边执行的10个数据。使用了PipeLineVariable定义之后,执行完成最终的结果如图4.30所示。
图4.30 执行基于PipeLine定义参数的结果
为什么是这个结果呢?这里我们来分析下三个ForEach-object 所做的操作。
· 第一个ForEach 将1~10传递到管道符右边,同时将1~10的值赋值给$Left变量。
· 第二个ForEach 处理第一个结果,同时将1~10赋值给Right。
· 第三个 ForEach 将变量$Left 和$Right 按照顺序相乘。
WarningAction是指执行PowerShell命令出现警告之后的操作,在PowerShell默认环境中存在WarningPreference参数定义命令执行过程中出现警告后的操作。如果希望在当前命令中出现警告后执行特殊的操作,就需要在PowerShell命令中使用 WarningAction 参数定义出现警告后的操作,这个操作将覆盖PowerShell 环境下默认的WarningPreference 操作。WarningAction参数中支持的操作如下。
· Continue:继续执行,命令会显示警告信息并且继续执行。
· Inquire:出现警告后会询问是否继续执行。
· SilentContinue:出现命令警告后不显示错误并且继续执行。
· Stop:出现警告后立即停止执行,不会继续执行其他代码。
通常来说,警告信息用于排错,如果不能确定命令执行过程,可以使用Switch参数定义警告之后的操作。
在默认情况下,PowerShell的警告信息不会输出,也没有类似错误一样的参数记录警告信息。如果在执行命令过程中希望将警告信息记录下来,可以使用WarningVariable定义警告信息保存的变量。默认情况下定义的变量将采用覆盖的方式进行数据保存,如果希望警告数据以累加方式保存在变量中,只需要在变量前面加上“+”即可。这些警告信息是Cmdlet或Function在编写过程中利用Write-Warning命令写入的。
Whatif 分析在数学计算领域中是基于条件的模拟测试,用于模拟改变条件后的结果。在Power Shell命令中,也支持这样的模拟操作。模拟操作的主要目的是了解命令执行结果,执行的结果将以执行信息显示执行的整个过程。通过命令的Whatif参数,可以了解执行的步骤是否与预期相符。这里需要注意的是,不是所有的命令都支持Whatif操作,支持Whatif操作命令多为配置改变的命令,例如,以New、Set、Update等动词修改特定属性或者创建对象的命令都支持Whatif操作。图4.31所示为新建对象的模拟操作。
图4.31 新建对象模拟操作
如果希望知道命令是否支持Whatif操作,可以使用Get-Help命令来了解命令是否支持Whatif操作,图4.32所示为确定命令是否支持Whatif操作。
图4.32 获取命令是否支持Whatif操作
Confirm 参数是用来确认命令执行操作的再确认,默认情况下,命令执行过程是否需要再确认取决于 PowerShell 中的ConfirmPreference的值。如果希望在PowerShell执行过程中改变再确认选项,可以通过Confirm参数替换ConfirmPreference首选项的值。在实际的命令中,如果希望了解目前PowerShell命令是否支持Confirm参数,我们可以通过Get-Help -Parameter获取Confirm 的参数设定,图4.33所示为New-Item的Confirm参数。
图4.33 命令中的Confirm 参数