首页 > 代码库 > (23)Powershell中的首选项变量

(23)Powershell中的首选项变量

    上一节介绍了 Powershell 中的环境变量,本节介绍 Powershell 中的首选项变量,这些变量的作用与环境变量类似,都是Powershell中的内置变量,也可以对这些值进行更改。需要注意的是,首选项变量影响 PowerShell 操作环境以及在该环境中运行的所有命令。在很多情况下,cmdlet 带有的参数可用于替代特定命令的首选行为。


    以下是 Powershell 中常见的首选项变量及其默认值。

首选项变量默认值及说明
$ConfirmPreference High
$DebugPreferenceSilentlyContinue
$ErrorActionPreference Continue
$ErrorViewNormalView
$FormatEnumerationLimit4
$LogCommandHealthEventFalse(不写入日志),记录命令初始化和进行处理时产生的错误和异常
$LogCommandLifecycleEventFalse(不写入日志),记录命令和命令管道的启动和停止,以及命令发现过程中的安全异常。
$LogEngineHealthEventTrue(写入日志),记录会话的错误和故障。
$LogEngineLifecycleEventTrue(写入日志),记录会话的打开和关闭。
$LogProviderLifecycleEventTrue(写入日志),记录添加和删除 Windows PowerShell 提供程序。
$LogProviderHealthEventTrue(写入日志),记录提供程序错误,如读写错误、查找错误以及调用错误。
$MaximumAliasCount4096,确定在 Windows PowerShell 会话中允许多少个别名。可以使用命令 (get-alias).count 统计别名数量。
$MaximumDriveCount4096,确定在给定的会话中,允许多少个 Windows PowerShell 驱动器。可以使用命令 (get-psdrive).count统计数量。
$MaximumErrorCount256,确定在会话的错误历史记录中保存多少个错误。$Error[0]是最新的错误信息。
$MaximumFunctionCount4096,确定给定会话中允许多少个函数。可以使用

(get-childitem function:).count 统计当前会话中的函数个数。

$MaximumHistoryCount64,确定当前会话的命令历史记录中保存多少条命令。
$MaximumVariableCount4096,确定给定会话中允许多少个变量,包括自动变量、首选项变量以及在命令和脚本中创建的变量。
$OFS""(空格字符),输出字段分隔符。指定在数组转换为字符串时,用来分隔数组元素的字符。
$OutputEncodingASCIIEncoding,PowerShell 在将文本发送给其他应用程序时,所使用的字符编码方法。
$ProgressPreferenceContinue,显示操作执行的进度条,并继续执行。
$PSEmailServer(无)指定用于发送电子邮件的默认电子邮件服务器。
$PSSessionApplicationNameWSMAN
$PSSessionConfigurationNamehttp://schemas.microsoft.com/powershell/microsoft.powershell   指定使用 WS-Management 技术的远程命令的默认应用程序名称。
$VerbosePreferenceSilentlyContinue, 默认不显示命令操作的详细消息。继续执行。
$WarningPreferenceContinue,默认显示操作执行的警告消息,然后继续执行。
$WhatIfPreference0,默认不自动启用 WhatIf。若要手动启用它,请使用命令的 WhatIf 参数。

    以上列出的是常见的首选项及其默认值,如果要查看全部的首选项变量,输入命令 Get-Variable 进行查看。


  1. 首选项命令值的查看与更改

    如果要查看某个具体的首选项的值,直接输入首选项变量的名称。例如

PS C:\> $ConfirmPreference
High

    如果要更改首选项变量的值,使用赋值语句,例如:

PS C:\> $ConfirmPreference = "Medium"
PS C:\> $ConfirmPreference
Medium

    需要注意的是,首选项变量与其他变量一样,在当前回话对值所做的更改,只针对当前窗口(会话)有效。如果需要使更改永久有效,需要把更改写入 Powershell 配置文件中。另外,Powershell 中的首选项往往有指定的可选值,即只能把可选值中的一个赋值给该变量,而不是可以赋值任何值。以下会对每个首选项变量做详细说明以及其所有的可选值。


2. $ConfirmPreference

    根据命令的名称可知,该命令与确认(Confirm)有关。Powershell 对每一个命令执行结果可能产生的影响划分了一个等级(High、Medium、Low 或 None),也就是对每一个命令都划分了风险(对当前系统可能产生的影响)等级。

    如果 $ConfirmPreference 值(High、Medium、Low 或 None)大于等于命令操作的风险(High、Medium、Low 或 None)时,PowerShell 会在执行该操作之前自动请求用户确认(告诉你输入的命令可能存在风险,是否要继续执行)。

    $ConfirmPreference 有以下有效可选值。

有效可选值
说明
None不自动确认任何 cmdlet 操作。用户必须使用 Confirm 参数来请求确认特定命令。即Powershell认为你输入的每一条命令都有可能存在风险,每条命令都需要明确确认
Low对命令风险等级为低、中或高的命令操作自动提示确认。如果要阻止特定命令提示确认,可以使用通用参数 -Confirm:$false。
Medium对命令风险等级为中或高的命令操作自动提示确认。如果要为特定命令启用提示确认,可以使用 -confirm。如果要阻止特定命令提示确认,请使用 confirm:$false。
High默认值。对命令等级为高风险的命令操作自动提示确认。如果要为特定命令启用提示确认,可以使用 -confirm。如果要阻止特定命令提示确认,请使用 -confirm:$false。

    哪些行为在Powershell中会被认定为有风险行为?比如删除文件,停掉所有的Service,命令执行需要占用大量系统资源等。例如:

PS C:\> $ConfirmPreference
Medium
PS C:\> cd D:\MyPowerShell
PS D:\MyPowerShell> Remove-Item .\Test.ps1
确认
是否确实要执行此操作?
对目标“D:\MyPowerShell\Test.ps1”执行操作“删除文件”。
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”):

    在上面的例子中 $ConfirmPreference 的值为"Medium"。需要注意的是,Powershell中的大部分命令的风险等级为"Medium",而$ConfirmPreference 的默认值时"High",所以在大部分的时候,并不会自动提示。如果需要要激活自动提示,可以将$ConfirmPreference的值更改为"Medium"或者"Low"。


3. $DebugPreference

    从命令的名称可知,与调试(Debug)有关。Powershell 根据该值,确认如何对待调试信息(脚本、cmdlet 或提供程序生成的调试消息,或者 Write-Debug 命令在命令行上生成的调试消息)-是忽略还是继续执行。有以下可选值:

有效可选值说明
Stop显示调试信息并停止命令的执行,并把错误输出到控制台。
Inquire显示调试信息,并和你确认是否要继续执行。
Continue显示调试信息,并继续执行。
SilentlyContinue默认值。不显示调试信息,继续执行不发生中断,相当于直接忽视调试信息。如果要强制显示调试信息,请使用 -Debug 参数。

    调试信息通常是对开发人员有效,具有比较强的专业性(其他人看了也是一脸懵逼^_^),所以默认情况下不显示调试信息。例如例子说明了SilentlyContinue的作用:

PS C:\> $DebugPreference
SilentlyContinue
PS C:\> Write-Debug "This is debug message"
PS C:\> Write-Debug "This is debug message" -Debug
调试: This is debug message
确认
是否继续执行此操作?
[Y] 是(Y)  [A] 全是(A)  [H] 终止命令(H)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”):

    以下示例说明了其他3个参数的用法及所代表的含义:

PS C:\> $DebugPreference = "Continue"
PS C:\> $DebugPreference
Continue
PS C:\> Write-Debug "This is debug message"
调试: This is debug message
PS C:\> Write-Debug "This is debug message" -Debug:$false
PS C:\> $DebugPreference = "Stop"
PS C:\> $DebugPreference
Stop
PS C:\> Write-Debug "This is debug message"
调试: This is debug message
Write-Debug : 已停止执行命令,因为首选项变量“DebugPreference”或通用参数被设置为 Stop。
所在位置 行:1 字符: 12
+ Write-Debug <<<<  "This is debug message"
    + CategoryInfo          : OperationStopped: (:) [Write-Debug], ParentContainsErrorReco
    + FullyQualifiedErrorId : ActionPreferenceStop,Microsoft.PowerShell.Commands.WriteDebu
PS C:\> Write-Debug "This is debug message" -Debug:$false
PS C:\> $DebugPreference = "Inquire"
PS C:\> Write-Debug "This is debug message"
调试: This is debug message
确认
是否继续执行此操作?
[Y] 是(Y)  [A] 全是(A)  [H] 终止命令(H)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”): PS C:\>
PS C:\> Write-Debug "This is debug message" -Debug:$false
PS C:\>

    通过以上示例可知,对于任何调试信息都可以通过 -Debug:$false 或者 -Debug:$true 来阻止或是激活调试信息。


4. $ErrorActionPreference

    $ErrorActionPreference 与 $DebugPreference 非常类似,只是前者是用来处理错误信息,而不是调试信息。Powershell 根据 $ErrorActionPreference 的值,确定如何响应命令行、脚本、cmdlet 或提供程序中的非终止性错误(不会导致cmdlet 处理停止的错误),如 Write-Error cmdlet 生成的错误。

    $ErrorActionPreference 提供了以下有效可选值:

有效值说明
Stop显示错误信息并停止执行
Inquire显示错误信息,并和你确认是否要继续执行
Continue默认值显示错误信息并继续执行
SilentlyContinue不显示错误信息,继续执行不发生中断

    以下示例说明了不同值的不同作用。

PS C:\> $ErrorActionPreference
Continue
PS C:\> Write-Error "This is error message"
Write-Error "This is error message" : This is error message
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
PS C:\> Write-Error "This is error message" -ErrorAction:SilentlyContinue
PS C:\>
PS C:\>
PS C:\> $ErrorActionPreference = "SilentlyContinue"
PS C:\> $ErrorActionPreference
SilentlyContinue
PS C:\> Write-Error "This is error message"
PS C:\> Write-Error "This is error message" -ErrorAction:continue
Write-Error "This is error message" -ErrorAction:continue : This is error message
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException
PS C:\>
PS C:\>
PS C:\> $ErrorActionPreference
SilentlyContinue
PS C:\> Get-ChildItem -path notExistFile.txt
PS C:\> $ErrorActionPreference = "Continue"
PS C:\> Get-ChildItem -path notExistFile.txt
Get-ChildItem : 找不到路径“C:\notExistFile.txt”,因为该路径不存在。
所在位置 行:1 字符: 14
+ Get-ChildItem <<<<  -path notExistFile.txt
    + CategoryInfo          : ObjectNotFound: (C:\notExistFile.txt:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
PS C:\> Get-ChildItem -path notExistFile.txt -ErrorAction:SilentlyContinue
PS C:\>
PS C:\>
PS C:\> $ErrorActionPreference = "Inquire"
PS C:\> $ErrorActionPreference
Inquire
PS C:\> Get-ChildItem -path notExistFile.txt
确认
找不到路径“C:\notExistFile.txt”,因为该路径不存在。
[Y] 是(Y)  [A] 全是(A)  [H] 终止命令(H)  [S] 挂起(S)  [?] 帮助 (默认值为“Y”):

5. $ErrorView

    Powershell 中错误信息的显示格式。有以下两个可选值:

有效可选值说明
NormalView默认值。错误信息的详细视图(View),包括错误描述、错误中所涉及对象的名称,以及指向命令中导致错误的词的箭头 (<<<<)。
CategoryView错误信息的简明结构化视图。格式为:{Category}: ({TargetName}:{TargetType}):[{Activity}], {Reason}

    以下例子说明了错误信息显示格式的不同:

PS C:\> $ErrorView
NormalView
PS C:\> Get-ChildItem -path notExistFile.txt
Get-ChildItem : 找不到路径“C:\notExistFile.txt”,因为该路径不存在。
所在位置 行:1 字符: 14
+ Get-ChildItem <<<<  -path notExistFile.txt
    + CategoryInfo          : ObjectNotFound: (C:\notExistFile.txt:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
PS C:\> $ErrorView = "CategoryView"
PS C:\> Get-ChildItem -path notExistFile.txt
ObjectNotFound: (C:\notExistFile.txt:String) [Get-ChildItem], ItemNotFoundException

    需要注意的是,ErrorView 的值只影响错误显示;它不会更改存储在 $error 自动变量中的错误对象的结构。

    $error 自动变动变量是包含错误信息的数组,第一个元素(下标为0)包含的是最新的错误信息。例如在上面的语句执行后,error[0]错误信息如下:

PS C:\> $Error[0] | Format-List -Property * -Force
PSMessageDetails      :
Exception             : System.Management.Automation.ItemNotFoundException: 找不到路径“C:\notExistFile.txt”,因为该路
                        径不存在。
                           在 System.Management.Automation.SessionStateInternal.GetChildItems(String path, Boolean recu
                        rse, CmdletProviderContext context)
                           在 System.Management.Automation.ChildItemCmdletProviderIntrinsics.Get(String path, Boolean r
                        ecurse, CmdletProviderContext context)
                           在 Microsoft.PowerShell.Commands.GetChildItemCommand.ProcessRecord()
TargetObject          : C:\notExistFile.txt
CategoryInfo          : ObjectNotFound: (C:\notExistFile.txt:String) [Get-ChildItem], ItemNotFoundException
FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
ErrorDetails          :
InvocationInfo        : System.Management.Automation.InvocationInfo
PipelineIterationInfo : {0, 1}

6. $FormatEnumerationLimit

    确定一次显示中包含多少个枚举项(显示多少项)。该变量不会影响基础对象;只影响显示。当$FormatEnumerationLimit 的值小于枚举项的数量时,PowerShell  会添加一个省略号(...)来指示还有其他项未显示。有效值:整数 (Int32),默认值:4 。 例如:

PS C:\> $FormatEnumerationLimit
4
PS C:\> Get-Service | Group-Object -Property Status | Format-List
Name   : Stopped
Count  : 62
Group  : {System.ServiceProcess.ServiceController, System.ServiceProcess.ServiceController, System.ServiceProcess.Servi
         ceController, System.ServiceProcess.ServiceController...}
Values : {Stopped}
Name   : Running
Count  : 41
Group  : {System.ServiceProcess.ServiceController, System.ServiceProcess.ServiceController, System.ServiceProcess.Servi
         ceController, System.ServiceProcess.ServiceController...}
Values : {Running}
PS C:\> $FormatEnumerationLimit = 6
PS C:\> Get-Service | Group-Object -Property Status | Format-List
Name   : Stopped
Count  : 62
Group  : {System.ServiceProcess.ServiceController, System.ServiceProcess.ServiceController, System.ServiceProcess.Servi
         ceController, System.ServiceProcess.ServiceController, System.ServiceProcess.ServiceController, System.Service
         Process.ServiceController...}
Values : {Stopped}
Name   : Running
Count  : 41
Group  : {System.ServiceProcess.ServiceController, System.ServiceProcess.ServiceController, System.ServiceProcess.Servi
         ceController, System.ServiceProcess.ServiceController, System.ServiceProcess.ServiceController, System.Service
         Process.ServiceController...}
Values : {Running}

7. 总结

    这节介绍了 Powershell中的首选项变量,这些变量的作用于环境变量类似,需要注意的是,更改首选项变量不只针对当前会话,对再次打开的窗体任然有效,这些首选项都提供了默认的参数值,对于刚开始不熟悉的,尽量不要去更改这些变量的默认值,了解每个变量的作用即可。


本文出自 “花开花落” 博客,谢绝转载!

(23)Powershell中的首选项变量