Powershell中的首选项变量集合

时间:2016-12-10 00:21:57

标签: powershell variables collections preference

我正在研究将整套偏好变量导入远程范围。 PowerShell是否实现了变量集合?是否有一组偏好变量?如果是这样,我是否可以使用$ using导入集合:?

类似的东西:

Begin { 
    $scriptblock = { 
        Try {
            $VerbosePreference = $Using:VerbosePreference
            $ErrorActionPreference = $Using:ErrorActionPreference
            ...
        } 
        Catch{ #Ignore these errors }

...

如果可能的话,我想导入所有首选项变量而不单独指定...

1 个答案:

答案 0 :(得分:1)

PowerShell(自v5.1起):

  • 未实现变量的集合
  • 并且没有编程方式明确无误地识别所有偏好变量。

有关所有偏好变量的当前列表,请参阅Get-Help about_Preference_Variables

也就是说,您可以将通配符表达式*PreferenceGet-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

这依赖于以下假设:只有首选项变量具有(验证)属性通常为true,但同样,您可以自由定义自己的变量使用验证属性,然后将错误地包括在内。

$_.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] }