我正在研究将整套偏好变量导入远程范围。 PowerShell是否实现了变量集合?是否有一组偏好变量?如果是这样,我是否可以使用$ using导入集合:?
类似的东西:
Begin {
$scriptblock = {
Try {
$VerbosePreference = $Using:VerbosePreference
$ErrorActionPreference = $Using:ErrorActionPreference
...
}
Catch{ #Ignore these errors }
...
如果可能的话,我想导入所有首选项变量而不单独指定...
答案 0 :(得分:1)
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
这依赖于以下假设:只有首选项变量具有(验证)属性,通常为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] }