的PowerShell(V5.1开始):
- 不执行集合的变量,
- 并且有否编程方式为明确且详尽地标识所有偏好变量。
有关所有首选变量的当前列表,请参阅Get-Help about_Preference_Variables
。
这就是说,你可以使用通配符表达*Preference
与Get-Variable
定位选项变量至少一些 - 也许他们覆盖您的需求:
> (Get-Variable *Preference).Name
ConfirmPreference
DebugPreference
ErrorActionPreference
InformationPreference
ProgressPreference
VerbosePreference
WarningPreference
WhatIfPreference
如前所述,结果既不保证(例如,MaximumHistoryCount
不匹配),也不排除潜在的误报(例如,阻止您定义变量$FooPreference
)。
如果您愿意从about_Preference_Variables
帮助主题中提取所有变量名称 - 这不是完全健壮的 - 请参阅本文的底部。
总体而言,最好的逼近可能是下面的命令:
> Get-Variable |
Where-Object {
$_.Name -clike '*Preference' -or
($_.Attributes -and $_.Options -notcontains 'ReadOnly')
} | % Name
ConfirmPreference
DebugPreference
ErrorActionPreference
InformationPreference
MaximumAliasCount
MaximumDriveCount
MaximumErrorCount
MaximumFunctionCount
MaximumHistoryCount
MaximumVariableCount
OutputEncoding
ProgressPreference
PSDefaultParameterValues
VerbosePreference
WarningPreference
WhatIfPreference
这依赖于唯一的偏好变量有(验证)属性,这是通常真正的假设,但是,再次,您可以自由地使用验证属性来定义自己的变量,然后将其错误地包含进来。
$_.Options -notcontains 'ReadOnly'
杂草出只读变量,因为根据定义,它们不能变量偏好,如果他们不能修改。
至于在远程命令中使用这些变量/后台作业:
没有优雅的解决方案(和$using:
只用文字变量名的作品),但你可以尝试以下方法:
# Collect pref. variables, to the best of our ability.
$prefVarDefs = Get-Variable | ? { $_.Name -clike '*Preference' -or ($_.Attributes -and $_.Options -notcontains 'ReadOnly') }
# Pass them to the background/remote script block and have them
# assigned there.
Start-Job { $args | % { set-variable $_.Name $_.Value }; ... } -Args $prefVarDefs
注意Start-Job
被用作一个例子(因为它可以在不远程处理和在非提升会话中运行),但同样的规则适用与Invoke-Command
,例如,与相同的技术可与后者一起使用。
另一种选择是解析about_Preference_Variables
帮助主题,这是有点脆,但是它具有:
(Get-Help about_Preference_Variables) -creplace '(?s)\A.*?\r?\n +?Variable +Default Value\r?\n +?-+ +-+\r?\n(.+?)\r?\n\r?\n.*\Z', '$1' -split '\r?\n' | % { (-split $_)[0] }
开始{$ 脚本块= { 尝试{$ VerbosePreference = $使用:VerbosePreference $ ErrorActionPreference = $使用:ErrorActionPreference} 捕捉{ #Ignore这些错误 } –
我d喜欢导入所有首选项变量,如果可能的话无需单独指定。 –