Powershell 在CSV中使用变量

Powershell 在CSV中使用变量,powershell,Powershell,我有3个变量。每个变量都是一个用户数组。 我正在尝试在PowerShell中创建一个CSV,它在单独的标题中包含这3个数组,但我使用的代码不起作用 代码如下: $buildcsv = @" 1st Notification, 2nd Notification, 3rd Notification $1nclient, $2nclient, $3nclient "@ $excsv = ConvertFrom-Csv $buildcsv 然而,输出只给我标题,而不是相关的用户列表 PS> $exc

我有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 ---------------- ---------------- ----------------
是否存在
System.Array
类型的变量不起作用的原因?

不幸的是,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                          

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。因此,几乎不需要编码来解释这一点。也不需要构建阵列。只要使用管道。如果您愿意,您可以在此末尾附加
导出CSV


请注意,我们必须保证数组类型具有类似
@()
的属性,否则PowerShell会将字符串本身视为一个数组,并从字符串中的位置而不是第一个元素返回单个字母。

给我们一个$1nclient的示例,$2nclient和$3nclient以及您期望的输出。在定义多行字符串之前是否填充了这些变量?另外,
$input
是一个不应用作正则变量的变量。@MartinBrandl所有三个变量的示例都是一个不同的计算机名称列表:$1nclient=hi.microsoft.com,hello.microsoft.com。--$2n客户端=bye@microsoft.com, Goodbye@microsoft.com, Seeya@microsoft.com---$3nclient=pinkpuppy@microsoft.comWith在
$buildcsv
之前定义的
$1nclient
$2nclient
$3nclient
我在输出中看到了值(尽管不是您期望的格式)。如果您不在
$buildcsv
之后定义3个列表,或者您的代码中有一些您没有告诉我们的内容。哦!您正在尝试转置数组。好的,这是可以做到的,但并不简单。我很确定我之前已经发布了这个问题的答案,让我看看是否能找到。谢谢你的回复。但是,难道没有更有效的方法来填充csv文件的列吗?如果我创建了一个excel.application对象和一个工作表,并运行foreach循环来填充列中的每个单元格,该怎么办?同样-这段代码可以工作,但我在$objects变量中得到了添加的信息。为了进一步解释,我将从导入的CSV报告中填充$1nclient变量。所以当我运行你的代码时,我实际上得到了@{display\u client\u name=hi@microsoft.com}其中display_client_name是导入的csv中标题的名称。此代码有效,但我在$objects变量中获得了添加的信息。为了进一步解释,我将从导入的CSV报告中填充$1nclient变量。所以当我运行你的代码时,我实际上得到了@{display\u client\u name=hi@microsoft.com}其中,display_client_name是导入的csv中标题的名称您需要扩展属性。只需添加$1nclient[$\即可。显示\客户端\名称@贾斯汀比格利
$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[$_]
    }
}