【问题标题】:How to combine and rename properties of arrays in powershell?如何在powershell中组合和重命名数组的属性?
【发布时间】:2019-04-03 21:58:00
【问题描述】:

我正在从 ConnectWise 提供的 API 中提取数据。我正在尝试提取用户名和密码列表并将它们放入我可以在另一个脚本(或与此脚本的组合)中引用的格式,或者我可以导出到 CSV。如果可能的话,我更喜欢第一个。

代码:

Function Get-CWConfiguration
{
[string]$BaseUri     = "$CWServerRoot"
[string]$Accept      = "application/vnd.connectwise.com+json; version=v2015_3"
[string]$ContentType = "application/json"
[string]$Authstring  = $CWInfo + '+' + $CWCredentials1 + ':' + $CWCredentials2 
$encodedAuth         = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(($Authstring)));

$Headers=@{"Authorization"="Basic $encodedAuth"}
Invoke-RestMethod -URI $BaseURI -Headers $Headers -ContentType $ContentType -Method Get
}

$username = (Get-CWConfiguration).questions | Where-Object {($_.questionid -eq 419)} | Sort-Object -Property questionid | select answer
$password = (Get-CWConfiguration).questions | Where-Object {($_.questionid -eq 420)} | Sort-Object -Property questionid | select answer

$username 变量上方的所有内容都是连接到 API 的内容,我没有修改它。下面的代码是我发现提取所需信息的最佳方式。这会将每个变量作为数组返回,这很好,但如果发生这种情况,我需要一个包含 2 列的数组。一个命名为用户名,另一个命名为密码。如果我执行 $username | Get-Member 它会返回:

Name        MemberType   Definition                         
----        ----------   ----------                         
Equals      Method       bool Equals(System.Object obj)     
GetHashCode Method       int GetHashCode()                  
GetType     Method       type GetType()                     
ToString    Method       string ToString()                  
answer      NoteProperty string answer=admin@admin.com

我的最终目标是让像$credentials 这样的变量输出如下所示:

Username             Password
--------            ----------                         
admin1@admin.com      Password1
admin2@admin.com      Password2
admin3@admin.com      Password3

我尝试过的大多数方法都导致所有内容都输出到 1 行或 1 列。我不确定是否应该合并数组并重命名$username.answer$password.answer 字段或创建PSObject?我的主要困难是两个变量都有相同的answerNoteProperty

【问题讨论】:

  • 根据我的经验,输出到一行或一列的所有内容都是因为您正在明确处理字符串。您将要创建一个新的 CustomPSObject 并为其分配两个属性,一个是 $Username.Answer,另一个是 $Password.Answer,正如您所指出的。或者设置该属性,选中并展开,等于另一个变量,然后对其进行一些字符串操作以使其看起来正确。
  • 好吧,是的,CustomPSObject 似乎是要走的路。我还没有完成字符串操作,我是 powershell 新手。我潜入这个兔子洞更深处!非常感谢您的回复。

标签: arrays powershell arraylist


【解决方案1】:

您希望使用当前对象的扩展属性创建新对象。这可能看起来像这样(请注意,我正在为您正在处理的事情手动创建类似物,并忽略您可能必须做的字符串操作)

$Username = New-Object -TypeName pscustomobject -Property @{Answer = "Answer:Hithisispatrick"}
$Password = New-Object -TypeName pscustomobject -Property @{Answer = "Answer:HelloThisisSquidward"}

$UsernameAnswer = $Username | Select -ExpandProperty Answer
$PasswordAnswer = $Password | Select -ExpandProperty Answer


$Final = New-Object -TypeName pscustomobject -Property @{UserName= $UsernameAnswer ; Password = $PAsswordAnswer}

这应该会给你这样的输出:

UserName               Password
--------               --------
Answer:Hithisispatrick Answer:HelloThisisSquidward

然后如果你想参数化它/扩展它,你应该能够将它扔进一个 foreach 循环并让它输出自定义对象,将其设置为一个数组,然后由这些对象构建,比如所以(我将使用 while 使其更易于显示):

$Count = 0
$Username = New-Object -TypeName pscustomobject -Property @{Answer = "Answer:Hithisispatrick"}
$Password = New-Object -TypeName pscustomobject -Property @{Answer = "Answer:HelloThisisSquidward"}
$Array = While ($Count -lt 5){
$UsernameAnswer = $Username | Select -ExpandProperty Answer
$PAsswordAnswer = $Password | Select -ExpandProperty Answer

$Final = New-Object -TypeName pscustomobject -Property @{UserName= $UsernameAnswer ; Password = $PAsswordAnswer}
$Final
$Count += 1
}


$Array

这会产生这样的结果:

Password                    UserName
--------                    --------
Answer:HelloThisisSquidward Answer:Hithisispatrick
Answer:HelloThisisSquidward Answer:Hithisispatrick
Answer:HelloThisisSquidward Answer:Hithisispatrick
Answer:HelloThisisSquidward Answer:Hithisispatrick
Answer:HelloThisisSquidward Answer:Hithisispatrick

【讨论】:

  • 你给我的第一段代码实现了列的正确格式,但所有数据都在每列的一行中。另外,我知道你说你用了一段时间来使它更简单,但我想我可能不明白如何将它翻译成 foreach。抱歉,我对 PS 很陌生,而且还在学习很多东西。非常感谢您的回复!
  • 没问题,我完全可以理解这种混乱!我想我可能有点误解了,你可能不需要循环,这取决于这个调用的运作方式。我很抱歉,我不相信我理解你的意思,所有数据都在一行中柱子。当前是否返回多个用户名和密码,都在第一列中?如果是这样,你将不得不把那根绳子分开。将其存储到一个变量中,然后使用 -Split 运算符根据某种分隔符将其拆分为多个部分。如果您要提供混淆的结果,我可能会提供帮助
猜你喜欢
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2020-06-02
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多