2016-12-10 37 views
1

我正在研究将我的整套偏好变量导入到远程作用域。 PowerShell是否实现了变量的集合?有偏好变量的集合吗?如果是这样,我能用$ using导入集合吗?Powershell中偏好变量的集合

喜欢的东西:

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

... 

我想导入所有的偏好变量,而如果单独指定可能...

+0

开始{$ 脚本块= { 尝试{$ VerbosePreference = $使用:VerbosePreference $ ErrorActionPreference = $使用:ErrorActionPreference} 捕捉{ #Ignore这些错误 } –

+0

我d喜欢导入所有首选项变量,如果可能的话无需单独指定。 –

回答

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 

这依赖于唯一的偏好变量有(验证)属性,这是通常真正的假设,但是,再次,您可以自由地使用验证属性来定义自己的变量,然后将其错误地包含进来。

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

谢谢。我很惊讶。我将在PowerShell用户语音中看到有关如何实现这些集合的建议。再次感谢。 –

+0

@ M.Anselmi我的荣幸。我用更好的_approximation_查找所有偏好变量来更新答案,但它不健壮。在https://windowsserver.uservoice.com/forums/301869-powershell寻求明确的功能是正确的方法。一旦您发布了您的建议,我鼓励您在此发布具体链接,以便未来的读者也可以轻松地投票,如果他们感兴趣的话。 – mklement0

+1

https://windowsserver.uservoice.com/forums/301869-powershell/suggestions/17407222-powershell-and-collections-in-particular-collect –