我有3个变量。每个变量都是一个用户数组。 我尝试在PowerShell中创建一个CSV,在单独的标题中包含这3个数组,但我使用的代码并不工作。
以下是代码:
$buildcsv = @"
1st Notification, 2nd Notification, 3rd Notification
$1nclient, $2nclient, $3nclient
"@
$excsv = ConvertFrom-Csv $buildcsv
但输出只给我标题,而不是相关的用户列表。
PS> $excsv 1st Notification 2nd Notification 3rd Notification ---------------- ---------------- ----------------
我期望的输出看起来像这样:
1st Notification 2nd Notification 3rd Notification
---------------- ---------------- ----------------
hi.microsoft.com bye@microsoft.com pinkpuppy@microsoft.com
hello.microsoft.com Goodbye@microsoft.com
Seeya@microsoft.com
为什么System.Array
类型的变量不起作用?
答案 0 :(得分:4)
不幸的是,这不是PowerShell的工作原理,因为你有一个列列表,而不是行列表(记录)。因此,您必须将列数组转换为行集合:
$1nclient = @("hi.microsoft.com", "hello.microsoft.com")
$2nclient = @("bye@microsoft.com", "Goodbye@microsoft.com", "Seeya@microsoft.com")
$3nclient = @("pinkpuppy@microsoft.com")
$biggestArray = [Math]::Max($1nclient.Count, ([Math]::Max($2nclient.Count, $3nclient.Count)))
$objects = @()
for ($i = 0; $i -lt $biggestArray; $i++)
{
if ($1nclient.Count -le $i) { $current1 = '' } else { $current1 = $1nclient[$i]}
if ($2nclient.Count -le $i) { $current2 = '' } else { $current2 = $2nclient[$i]}
if ($3nclient.Count -le $i) { $current3 = '' } else { $current3 = $3nclient[$i]}
$objects += [PsCustomObject]@{
'1st Notification' = $current1
'2nd Notification' = $current2
'3rd Notification' = $current3
}
}
$objects
<强>输出:强>
1st Notification 2nd Notification 3rd Notification
---------------- ---------------- ----------------
hi.microsoft.com bye@microsoft.com pinkpuppy@microsoft.com
hello.microsoft.com Goodbye@microsoft.com
Seeya@microsoft.com
答案 1 :(得分:2)
CSV对象不是按照您在其他答案和评论中发现的方式构建的。通常,每一行必须是它自己的对象,它与之前的每一行具有相同的属性。我们这里没有制作真正的CSV,而是列表的集合。
我想展示PowerShell对数组表示法的宽容以及另一种确定行数的方法。
$1nclient = @("hi.microsoft.com", "hello.microsoft.com")
$2nclient = @("bye@microsoft.com", "Goodbye@microsoft.com", "Seeya@microsoft.com")
$3nclient = @("pinkpuppy@microsoft.com")
$maximumEntries = ($1nclient,$2nclient,$3nclient | Measure-Object -Property Count -Maximum).Maximum
0..($maximumEntries - 1) | ForEach-Object{
[pscustomobject][ordered]@{
'1st Notification' = $1nclient[$_]
'2nd Notification' = $2nclient[$_]
'3rd Notification' = $3nclient[$_]
}
}
在PowerShell中调用不存在的数组元素将返回null。因此,很少有编码需要考虑到这一点。也不需要构建阵列。只需使用管道。如果你愿意的话,你可以在Export-CSV
结束。
请注意,保证数组类型与@()
之类的内容非常重要,否则PowerShell会将字符串本身视为数组,并从字符串中的位置返回单个字母而不是第一个元素。