【问题标题】:Extract data string from an array and assign them to a variable by concatenation in PowerShell从数组中提取数据字符串并在 PowerShell 中通过连接将它们分配给变量
【发布时间】:2019-03-01 14:05:53
【问题描述】:

我有一个对象数组,例如:

$arrayServ = New-Object System.Collections.ArrayList(,$serv)

这个数组包含一些对象,例如:

name        prefix                     tenants                  
----        ------                     -------                  
TOTO        http://home/toto           bob, michael, ramy, anna
Nav         http://8.8.8.8/google      com, uk, fr

我正在尝试提取属性name 中的所有数据并将它们放入一个变量中,并将该变量与另一个变量连接起来,该变量是name 的计数器。

类似这样的:

$liste = "$i. $arrayServ [$i]"

我为什么要这样做?这是因为,我想在 InputBox 中显示 $liste,例如:

$liste = "$i. $arrayServ [$i]"
$msg = $liste -join "`n"
$item = InputBox $msg -title "Your choice"

输入框“您的选择”

请问有人知道我该怎么做吗?

【问题讨论】:

  • 添加到arraylist的时候,里面有什么? ,$Serv 通常是一个 array 表示法,它将数组放入arraylist 作为一个数组 而不是作为一系列对象。所以...你从$arrayServ[0].GetType()$arrayServ[1].GetType() 得到什么?
  • 顺便说一句:请避免使用伪方法语法:而不是 New-Object SomeType(arg1, ...),使用 New-Object SomeType [-ArgumentList] arg1, ... - PowerShell cmdlet 和函数的调用方式类似于 shell 命令(无括号、空格- 分隔的参数),不像 methods.

标签: powershell variables concatenation inputbox arrayobject


【解决方案1】:

据我所知,$serv 中已经有一个对象数组,因此没有理由将其放入 ArrayList..

如果是这种情况,您可以像这样创建$liste 数组:

$liste = @()
$i = 1
$serv | Select-Object -ExpandProperty name | ForEach-Object {
    $liste += "{0}. {1}" -f $i++, $_
}

然后将其用于输入框消息

$msg = $liste -join [Environment]::NewLine

使用您的示例,这将返回

1. TOTO
2. Nav

将其放入输入框:

Add-Type -AssemblyName 'Microsoft.VisualBasic'
$item = [Microsoft.VisualBasic.Interaction]::InputBox($msg, "Votre choix")

【讨论】:

  • 做得很好。在 PSv4+ 中,您可以缩短为 $arrayServ.name.ForEach({ '{0}. {1}' -f $i++, $_ })
  • 非常感谢。这正是我想要的:)
【解决方案2】:

如果要将所有名称放入变量中,可以在串联中使用indexOf(value)

$arrayServ = New-Object System.Collections.ArrayList(,$serv)

所以创建一个仅包含名称的数组:

$names = $arrayServ.name

根据提供的示例数据,如果您知道要显示该列表中的第二项,请获取“Nav”的索引值并添加 1,因为数组的第一个索引为 0,并且您想要计数,不是索引位置:

$count = $names.indexOf('Nav') + 1

$liste 设置为计数,然后在$names 的位置从$count 中插入项目减1,以便得到正确的值。

$liste = "$count. $($names[$count - 1])"

这应该会显示

2. Nav

【讨论】:

  • 我认为 OP 不需要任何 lookup 数组元素 - 只需 enumeration 和序列号。顺便说一句,重新调用New-Object:我知道您只复制了 OP 的代码,但鉴于这种反模式如此普遍,引用一个固定版本或指出问题是值得的:请避免使用伪方法语法:而不是New-Object SomeType(arg1, ...),使用New-Object SomeType [-ArgumentList] arg1, ... - PowerShell cmdlet 和函数的调用类似于 shell 命令(没有括号,空格分隔的参数),而不是 methods。跨度>
猜你喜欢
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2021-12-24
  • 2014-05-28
  • 2020-01-20
  • 2018-01-01
  • 1970-01-01
相关资源
最近更新 更多