0

我是 powershell 新手,正在编写我的第一个有点复杂的脚本。我想导入一个 .csv 文件并用它创建多个文本数组。我认为我已经找到了一种可行的方法,但是生成我需要的所有行会很耗时。我假设我可以更简单地使用 foreach-object 来做到这一点,但我似乎无法正确使用语法。

查看我当前的代码...

$vmimport = Import-Csv "gss_prod.csv"
$gssall = $vmimport | ForEach-Object {$_.vmName}`
$gssweb = $vmimport | Where-Object {$_.tier -eq web} | ForEach-Object {$_.vmName}
$gssapp = $vmimport | Where-Object {$_.tier -eq app} | ForEach-Object {$_.vmName}
$gsssql = $vmimport | Where-Object {$_.tier -eq sql} | ForEach-Object {$_.vmName}

目标是创建 1 个组,其中所有条目仅包含 vmName 值,然后创建 3 个单独的组,仅包含 vmName 值但使用 tier 值对它们进行排序。

任何人都可以帮助我以更简单的方式做到这一点吗?

谢谢!

4

3 回答 3

2

对于最后三个,您可以按 Tier 属性对对象进行分组,并将结果作为 hashable。然后,您可以参考层名称来获取其虚拟机。

#group objects by tier
$gs = $vmimport | Group-Object tier -AsHashTable

# get web VMs
$gs['web']

# get sql VMs
$gs['app']
于 2013-05-31T19:16:31.347 回答
0

您可能希望使用字典来存储数据:

$vmimport = Import-Csv "gss_prod.csv"

$gssall = $vmimport | % { $_.vmName }

$categories = "web", "app", "sql", ...
$gss = @{}
foreach ($cat in $categories) {
  $gss[$cat] = $vmimport | ? { $_.tier -eq $cat } | % { $_.vmName }
}
于 2013-05-31T17:20:56.503 回答
0

我喜欢 Shay Levy 的方式,但哈希表的值仍然是哈希表。这是另一种更有效的方法,其中值是锯齿状数组,并且类别是自动生成的(与 Ansgar Wiechers 解决方案相反):

# define hashtable
$gs = @{};

# fill it
$vmimport | foreach {$gs[$_.tier]+=, $_.vmName};

# get web VMs
$gs['web'] # the result is an array of 'web' vmNames.
于 2013-05-31T19:41:59.523 回答