在CSV中使用变量

时间:2016-09-20 18:57:58

标签: powershell

我有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类型的变量不起作用?

2 个答案:

答案 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会将字符串本身视为数组,并从字符串中的位置返回单个字母而不是第一个元素。