【发布时间】:2019-09-13 19:14:09
【问题描述】:
我正在尝试读取一个 csv 文件并将其数据存储到我将用于 Powershell 脚本的变量中。 我设法通过执行以下命令读取文件:
$csv = Import-Csv C:\Users\[...]\Documents\ipaddresses.csv -delimiter "|"
$csv
输出如下:
IP Name
-- ----
165.XX.XX.1 n1
165.XX.XX.2 n2
165.XX.XX.3 n3
165.XX.XX.4 n4
165.XX.XX.5 n5
165.XX.XX.6 n6
我的想法是我可以创建 6 个变量,每个变量都像:
$Name = $IP
但是,当我尝试循环 $csv 变量的对象并将它们存储到这样的数组中时:
foreach($item in $csv){
IP = $($item.IP)
Name = $($item.Name)
}
它返回空数组。我该如何解决?
【问题讨论】:
-
您的变量赋值语法在此示例中不正确。变量在其名称之前由
$引用。因此,您至少必须拥有$IP = $line.IP和$Name = $line.Name。即使使用正确的语法,此示例中的变量也会在循环的每次迭代期间被覆盖。这意味着任何依赖于它们的操作都需要在该循环中发生。我不会使用$item作为变量名,因为我不确定在某些情况下这是否会导致与保留/自动变量发生冲突。 -
$csv确实已经包含您可能想要的所有信息。如果您需要在整个代码中保持对数据的访问,特别是在循环之外,您可以引用带有索引的特定行($csv[3]或$csv[2].IP)。您还可以访问整个数组中的属性($csv.Name或$csv.IP)。此外,变量赋值通常会抑制成功流输出。因此,您需要通过键入变量名称$IP或$Name来明确要求分配值。 -
@AdminOfThings 当我输入 $csv[2] 时,我确实得到了返回的索引 2 的行。但是,当我输入 $csv[2].IP 甚至只是 $csv.IP 时,什么都没有返回。我相信这是问题的根源。
-
在您执行
Import-Csv之后是否在操纵$csv?如果您的所有数据(包括标题)没有真正用 | 分隔,那么使用-Delimiter "|"将导致您的情况。如果 CSV 文件包含逗号而不是 |,请不要使用-Delimiter。该开关告诉 PowerShell 您的数据是如何分离的,而不是您希望在导入后如何分离它。 -
我找到了为什么它不起作用!即使我的 csv 的标题是大写的,如果我不使用大写,它也只会返回我想要的输出。这意味着如果我输入 $csv.ip 而不是 $csv.IP。不敢相信一直都是这个小细节,哈哈。感谢您的输出!
标签: powershell csv powershell-3.0