Windows PowerShell进阶PSBASE and more

上一篇的单词打错了,转置是transpose,不是traverse,代码已更改。

这篇打算讲下之前有提到过的psbase和psobject等用法(上篇提到的$csv_header=([array]$csv_object=ipcsv $csv_files[0])[0].psobject.Properties|%{$_.Name}),主要参考别的网站,部分机翻,有能力的小伙伴可直接看原文:

What’s up with PSBASE, PSEXTENDED, PSADAPTED, and PSOBJECT?

原文: https://blogs.msdn.microsoft.com/powershell/2006/11/24/whats-up-with-psbase-psextended-psadapted-and-psobject/

有人可能会问到:

I have seen adding psbase to a lot of things “fixes” problems… What is this psbase thing and why do I have to use it?

世界上有很多不同的对象和数据技术,每个技术都有自己的特点。我们大多数人从不关心这些细节,我们只需要数据和功能,就是这样。这些细节阻碍了我们解决问题的方式。最明显的例子就是XML,只是尝试从XML中获取数据 - 这是一个噩梦。

以此为背景,PowerShell“调整”各种对象技术,为它们提供标准化的对象视图。另一种考虑它的方式是我们用与数据库投影各种数据表的VIEW相同的方式来投影标准化的Object VIEW(有充分的理由说明为什么这些表存在它们存在的方式,但是作为用户 - 他们不希望我想让DBA创建一个VIEW)。

那么,如果你正在解决的具体问题实际上需要底层技术的细节,会发生什么?这就是PSBASE进来的地方,它可以让你访问对象本身。

我们实际上提供了一些对象的VIEWS:

示例:

我没有XML的扩展,所以让我们切换进程对象来显示:

以及我们可以在Get-Member的官网(https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Utility/Get-Member?view=powershell-5.1)解释中看到-Force中有如下解释(下文也会提到这个):

Adds the intrinsic members (PSBase, PSAdapted, PSObject, PSTypeNames) and the compiler-generated get_ and set_ methods to the display. By default,Get-Membergets these properties in all views other than Base and Adapted, but it does not display them.

The following list describes the properties that are added when you use theForceparameter:

PSBase: The original properties of the .NET Framework object without extension or adaptation. These are the properties defined for the object class and listed in MSDN.

PSAdapted. The properties and methods defined in the Windows PowerShell extended type system.

PSExtended. The properties and methods that were added in the Types.ps1xml files or by using the Add-Member cmdlet.

PSObject. The adapter that converts the base object to a Windows PowerShellPSObjectobject.

PSTypeNames. A list of object types that describe the object, in order of specificity. When formatting the object, Windows PowerShell searches for the types in the Format.ps1xml files in the Windows PowerShell installation directory ($pshome). It uses the formatting definition for the first type that it finds.

个人理解:这个还是之前我们一直强调的一个概念,那就是powershell是完全基于.NET框架之上的,我们在powershell中看到和使用的对象,很多都是微软已经为我们包装好的基于底层的对象,因为默认状态下考虑到这些包装好的对象已经可以基本解决管理人员的日常工作。

对于一些.NET对象,PowerShell使用包装来使它们更容易在shell中使用

例如 用于WMI,ADSI和XML对象。

大多数时候(对ADSI的期望),这是你想要的,但是如果你需要的话,使用一些高级功能,您可以使用.PSBase跳过包装,直接访问/使用.NET对象。

但是底层的更加细节的.NET对象依然留了接口给我们访问,在特定情况下我们需要使用的时候,就可以使用这些属性或者方法去调用。(下一篇试着引入2个例子来讲解这一使用)。

但是这有时候也会给我们带来一些如下麻烦:

Name collisions, PSBase and other mad PowerShell internals

原文:https://mnaoumov.wordpress.com/2013/07/23/name-collisions-psbase-and-other-mad-powershell-internals/

有时,我们可以在PowerShell中发现名称冲突,考虑下面例子:

当我们访问

我们得到tag。(编者:原文发表于2013年,我现在在自己机子上测试上面代码,是没有返回任何值的。$xml1.tag.gettype()返回的是System.String,而正确的应该是返回System.Xml.XmlElement,请使用下面例子测试,这个我在自己电脑测试没问题)

但是当我们访问

我们得到attributeValue

这是因为XmlNode.Name属性与从属性构造的自动NoteProperty Name名称冲突。

所以问题是如何从$xml2获取标签名称。 当我们的一个部署脚本出现类似问题时,花了大约15分钟才找到答案。

我不想只显示答案,我想讨论我发现它的方式。 顺便说一句,我找不到任何有用的谷歌或StackOverflow。 如果您能找到其他任何内容而不是此博客文章,欢迎您指点我(编者:原文发表于2013年,当时网上资源较少)

所以让我们从下面示例开始:

它有许多隐藏的成员,只有因为-Force参数才可见。

我们可以看到我们有一个名为get_Name的方法,正如我们可以轻易猜到的那样,所有的属性总是带有get_Property和set_Property方法。

所以如果我们访问:

我们会得到预期的结果tag

除此之外,当我查看Get-Member -Force的输出时,我发现了一些有趣的属性,如PSBase(编者:就是上面提到的那个),所以替代解决方案将是:

让我们考虑更复杂的综合案例:

我们如何检索psbase属性的值?

天真的做法:

将不起作用,因为另一次名称冲突,PSBase是一个特殊的属性。那么,我们可以使用属性方法

对于PowerShell 3我们可以使用

但是对于PowerShell 2这将会报错

我们只能使用更加复杂的方法来达到同一效果:

或者我们可以有一些棘手的代码,它不需要知道我们处理Xml节点。为了测试我尝试了不同的方法

我试过了下面方法却失败了,因为psbase是powershell的保留名称,就比如if,foreach等

然后我找到了另一个合成的方法:

$x.psbase并没有返回我们想要的(abc

请注意,我使用公共字段而不是属性。 否则,我们可以使用get_psbase方法,这是故意设置这么棘手属性。

我找到的解决方案如下,成功返回abc

同样,对于XmlNode这也适用,返回attributeValue

$x的另一种方法是使用反射(编者:了解就好,有点超纲了):

我们可以使用反射,因为它是对象的公平属性(原文是fair property,个人也不是太理解怎么翻译,了解即可)。

我无法发明只有名为psbase的NoteProperty的例子,对于这种情况,反射将不起作用,只有PSObject.Members才能在那里工作。

我知道这一切都很奇怪,但如果你明白这一点,你将会更好地理解一些PowerShell隐藏陷阱。

参考链接:

https://blogs.msdn.microsoft.com/powershell/2006/11/24/whats-up-with-psbase-psextended-psadapted-and-psobject/

https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Utility/Get-Member?view=powershell-5.1

https://mnaoumov.wordpress.com/2013/07/23/name-collisions-psbase-and-other-mad-powershell-internals/

https://stackoverflow.com/questions/21400470/in-windows-powershell-what-is-the-difference-between-objgroup-addobjuser-path

https://www.vistax64.com/threads/info-what-why-when-of-psbase.26916/

大家晚安。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180527G1EZEI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券