【问题标题】:How can I store data from a CSV file into local variables for a Powershell script?如何将 CSV 文件中的数据存储到 Powershell 脚本的局部变量中?
【发布时间】: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


【解决方案1】:

按照你的方法,你可以使用New-VariableGet-Variable

## Q:\Test\2019\04\24\SO_55830910.ps1
$csv = Import-Csv $Env:USERPROFILE\Documents\ipaddresses.csv -delimiter "|" 

foreach($item in $csv){
    "{0} = {1}" -f $item.Name,$item.IP
    New-Variable -Name $item.Name -Value $item.IP
}

1..6|%{Get-Variable "n$_"}

n1 = 165.XX.XX.1
n2 = 165.XX.XX.2
n3 = 165.XX.XX.3
n4 = 165.XX.XX.4
n5 = 165.XX.XX.5
n6 = 165.XX.XX.6

Name                           Value
----                           -----
n1                             165.XX.XX.1
n2                             165.XX.XX.2
n3                             165.XX.XX.3
n4                             165.XX.XX.4
n5                             165.XX.XX.5
n6                             165.XX.XX.6

【讨论】:

    【解决方案2】:

    您的循环没有返回任何内容,因为您没有存储或产生任何结果。应该这样做:

    $csv = Import-Csv C:\Users\[...]\Documents\ipaddresses.csv -delimiter "|"
    $csv | Select-Object -Property IP,Name
    
    # Or if you want a custom property
    $csv | Select-Object -Property IP, @{Name="Custom Name", Expression = {"Hostname is : " + $_.Name}
    

    阅读更多关于 Select-Object 的信息:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-3.0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 2021-10-23
      • 2019-09-19
      • 2012-05-17
      相关资源
      最近更新 更多