上一节介绍了 Powershell 中的环境变量,本节介绍 Powershell 中的首选项变量,这些变量的作用与环境变量类似,都是Powershell中的内置变量,也可以对这些值进行更改。需要注意的是,首选项变量影响 PowerShell 操作环境以及在该环境中运行的所有命令。在很多情况下,cmdlet 带有的参数可用于替代特定命令的首选行为。
以下是 Powershell 中常见的首选项变量及其默认值。
首选项变量 | 默认值及说明 |
$ConfirmPreference | High |
$DebugPreference | SilentlyContinue |
$ErrorActionPreference | Continue |
$ErrorView | NormalView |
$FormatEnumerationLimit | 4 |
$LogCommandHealthEvent | False(不写入日志),记录命令初始化和进行处理时产生的错误和异常 |
$LogCommandLifecycleEvent | False(不写入日志),记录命令和命令管道的启动和停止,以及命令发现过程中的安全异常。 |
$LogEngineHealthEvent | True(写入日志),记录会话的错误和故障。 |
$LogEngineLifecycleEvent | True(写入日志),记录会话的打开和关闭。 |
$LogProviderLifecycleEvent | True(写入日志),记录添加和删除 Windows PowerShell 提供程序。 |
$LogProviderHealthEvent | True(写入日志),记录提供程序错误,如读写错误、查找错误以及调用错误。 |
$MaximumAliasCount | 4096,确定在 Windows PowerShell 会话中允许多少个别名。可以使用命令 (get-alias).count 统计别名数量。 |
$MaximumDriveCount | 4096,确定在给定的会话中,允许多少个 Windows PowerShell 驱动器。可以使用命令 (get-psdrive).count统计数量。 |
$MaximumErrorCount | 256,确定在会话的错误历史记录中保存多少个错误。$Error[0]是最新的错误信息。 |
$MaximumFunctionCount | 4096,确定给定会话中允许多少个函数。可以使用 (get-childitem function:).count 统计当前会话中的函数个数。 |
$MaximumHistoryCount | 64,确定当前会话的命令历史记录中保存多少条命令。 |
$MaximumVariableCount | 4096,确定给定会话中允许多少个变量,包括自动变量、首选项变量以及在命令和脚本中创建的变量。 |
$OFS | ""(空格字符),输出字段分隔符。指定在数组转换为字符串时,用来分隔数组元素的字符。 |
$OutputEncoding | ASCIIEncoding,PowerShell 在将文本发送给其他应用程序时,所使用的字符编码方法。 |
$ProgressPreference | Continue,显示操作执行的进度条,并继续执行。 |
$PSEmailServer | (无)指定用于发送电子邮件的默认电子邮件服务器。 |
$PSSessionApplicationName | WSMAN |
$PSSessionConfigurationName | http://schemas.microsoft.com/powershell/microsoft.powershell 指定使用 WS-Management 技术的远程命令的默认应用程序名称。 |
$VerbosePreference | SilentlyContinue, 默认不显示命令操作的详细消息。继续执行。 |
$WarningPreference | Continue,默认显示操作执行的警告消息,然后继续执行。 |
$WhatIfPreference | 0,默认不自动启用 WhatIf。若要手动启用它,请使用命令的 WhatIf 参数。 |
以上列出的是常见的首选项及其默认值,如果要查看全部的首选项变量,输入命令 Get-Variable 进行查看。
- 首选项命令值的查看与更改
如果要查看某个具体的首选项的值,直接输入首选项变量的名称。例如
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中的首选项变量,这些变量的作用于环境变量类似,需要注意的是,更改首选项变量不只针对当前会话,对再次打开的窗体任然有效,这些首选项都提供了默认的参数值,对于刚开始不熟悉的,尽量不要去更改这些变量的默认值,了解每个变量的作用即可。