当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 创建 PowerShell 属性名称

作者:精品下载站 日期:2024-12-14 08:00:35 浏览:14 分类:玩电脑

创建 PowerShell 属性名称


大约上周,我一直在研究 Dave Carroll 的一个新 PowerShell 项目,以便在 PowerShell 提示符下使用 Twitter。该模块称为 BluebirdPS,您可以从 PowerShell Gallery 安装它。该模块仍处于早期阶段,但功能齐全且有趣。您可能会觉得这很有趣,原因并不是 Twitter,而是 Dave 如何利用 Twitter API。您可能会发现自己使用不同的 API 来构建基于 PowerShell 的工具。当您处理这些项目时,您总是需要考虑“管道中的对象”,其中一部分意味着创建正确的 PowerShell 属性名称。

使其用户友好

当您构建 PowerShell 工具时,您希望输出易于使用。对我来说,这意味着拥有明确定义的属性名称。 Dave 在模块中有一个命令来获取 Twitter 用户帐户。这是它当前写入管道的内容。

[玩转系统] 创建 PowerShell 属性名称

为了进行演示,假设 Get-TwitterUser 命令是调用 REST API 并向管道返回自定义对象的代码。

属性名称大部分都很清晰,但对 PowerShell 不太友好。您运行了多少个具有如下属性的本机 PowerShell 命令?让我们解决这个问题。

转换属性名称

某些属性名称是使用下划线作为分隔符的多单词。这是典型的,但我想某些 API 可能会创建一个类似 default-profile 的属性。在 PowerShell 中,我认为更好的属性名称是 DefaultProfile。这是改变它的一种方法。

首先,让我获取一个示例对象。

 $me = Get-TwitterUser -ScreenName jeffhicks

如何获取属性名称? PowerShell 在底层做了很多抽象工作,以使其易于使用。 $me 表示的对象还有另一层。

[玩转系统] 创建 PowerShell 属性名称

属性集合非常有用。

[玩转系统] 创建 PowerShell 属性名称

要“重新定义”属性名称,请在脑海中走一遍该过程或将其写下来。

  • 在 _ 分隔符上拆分名称
  • 对于数组中的每个元素,将第一个字母大写
  • 将数组连接回单个字符串,不带空格。

我需要一个 PowerShell 函数来完成此任务。正如您希望从我的列表中看到的那样,我实际上已经编写了核心代码。

Function Convert-PropertyName {
    Param(
        [Parameter(Mandatory)]
        [string]$Name,
        #the character used as a delimiter in the native property name
        [string]$Delimiter = "_"
        )

    #split on the underscore delimiter
    $split = $name -split $Delimiter

    #capitalize the first letter of each item in the array
    for ($i=0;$i -lt $split.count;$i++) {
        $split[$i] = "{0}{1}" -f $split[$i][0].ToString().ToUpper(),$split[$i].Substring(1)
    }

    #rejoin with no spaces and write the result to the pipeline
    $split -join ""
}

我编写的函数是灵活的,并且不假设所有属性名称都将使用下划线。

[玩转系统] 创建 PowerShell 属性名称

构建一个对象

考虑到这个功能,我可以编写一段简单的 PowerShell 代码来创建新的自定义对象。

$me.psobject.properties | Foreach-object -Begin {
    $newObj = [ordered]@{
        PSTypeName = "BlueBirdUser"
    }
} -process {
    $newProp = Convert-PropertyName $_.Name
    $newObj.Add($newProp,$_.value)
} -end {
    #write the result as a custom object
   [PSCustomObject]$newObj
}

该代码创建一个有序哈希表,然后为每个转换后的属性名称和 psobject 中的相应值添加一个条目。在 ForEach-Object 的末尾,我将一个实际对象写入管道。

[玩转系统] 创建 PowerShell 属性名称

我可以使用此代码并围绕核心 API 代码构建工具,现在将“更好”的 PowerShell 对象写入管道。房产价值仍然存在潜在问题。例如,CreatedAt 是一个字符串,而不是日期时间值。这可以稍后解决。

更新类型数据

您可能想要执行的最后一项任务是优化 PowerShell 使用新自定义对象的方式。现在,我的代码编写了一个具有所有属性的对象。虽然这可能很有用,但默认情况下用户可能只需要查看属性的子集。或者您可能想要微调一些属性名称。例如,我的输出现在有一个名为 StatusesCount 的属性。这真正意味着的是推文的数量。更改该属性名称会更加用户友好。

所有这些都是 Update-TypeData cmdlet 发挥作用的地方。为了使用此 cmdlet,您的对象必须具有已定义且唯一的类型名称。这些都不适用于通用 pscustomobject。在我的代码中,您可能已经注意到了这一点:

  PSTypeName = "BlueBirdUser"

如果我运行代码并通过管道连接到 Get-Member,我将看到 BlueBirdUser 的 TypeName。这意味着我可以使用 Update-TypeData。我相信您会阅读完整的帮助和示例。

首先,我想创建一些属性别名。 PowerShell 一直为您执行此操作。

Update-TypeData -TypeName BlueBirdUser -MemberType AliasProperty -MemberName Followers -Value FollowersCount -force
Update-TypeData -TypeName BlueBirdUser -MemberType AliasProperty -MemberName Tweets -Value StatusesCount -Force

另一步是我想定义一组默认属性,以便当运行我的命令并将自定义对象写入管道时,除非用户要求其他任何内容,否则它将显示默认属性集。

Update-TypeData -TypeName BlueBirdUser -DefaultDisplayPropertySet "Name","ScreenName","ID","Location","Description","Followers","Tweets" -force

[玩转系统] 创建 PowerShell 属性名称

如果您正在构建一个模块,则可能将 Convert-Property 作为私有函数,并将这样的命令作为公共函数。

Function Get-TwitterAccount {
    [cmdletbinding()]

    Param([string]$Username = "jeffhicks")

    #Get-TwitterUser could be any REST API related code that creates an objecgt
    $TwitterUser = Get-TwitterUser -ScreenName $UserName

    $TwitterUser.psobject.properties | ForEach-Object -Begin {
        $newObj = [ordered]@{
            PSTypeName = "BlueBirdUser"
        }
    } -Process {
        $newProp = Convert-PropertyName $_.Name
        $newObj.Add($newProp, $_.value)
    } -End {
        #write the result as a custom object
        [PSCustomObject]$newObj
    }

}

[玩转系统] 创建 PowerShell 属性名称

现在我有一个 PowerShell 工具,可以将正确的、结构良好的对象写入管道,我可以像任何其他命令一样使用它。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯