的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喜歡導入所有首選項變量,如果可能的話無需單獨指定。 –