PowerShell - 读入变量失败

时间:2014-12-04 15:52:14

标签: powershell

我在使用PowerShell从文件中读取数组时遇到问题(我需要使用它,bash工作正常,但我也必须解决PS中的问题)。所以,问题是程序很好地读入$ sofor参数,然后写出

 Write-Host $fajl[$i].split(",")[3]

行没有问题,但当我尝试将其读入下一行的数组时,我收到错误:

  Cannot index into a null array.
  At C:\Users...\PSa1.ps1:16 char:5
  +                 Write-Host $pontszam[$i]
  +                 ~~~~~~~~~~~~~~~~~~~~~~~~
  + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
  + FullyQualifiedErrorId : NullArray

我不知道为什么它第一次工作而不是第二次工作。任何的想法?非常感谢。见代码:

 switch ($param) 
 { 
     -v {
         $fajl = Get-Content C:\Users\freeze\Desktop\powershell\formula1.csv
         $i = 0
         while ($i -lt $fajl.length) {
             $sofor[$i] = $( ($fajl)[$i].split(",")[1]);
             Write-Host $fajl[$i].split(",")[3]
             $pontszam[$i] = $( $fajl[$i].split(",")[3]);
             Write-Host $sofor[$i]
             Write-Host $pontszam[$i]
             $i = $i + 1
        }

1 个答案:

答案 0 :(得分:4)

因此,您正在使用非常Bash的方式执行此操作(因为您有一个可用的Bash解决方案,因此可以理解)。您正在尝试使用文件中的字符串(再次可以理解来自Bash)。 Powershell是使用内置对象的概念构建的,因此这是一种更好的方法来处理它。

让我们从Powershell已经理解CSV的事实开始。首先将CSV加载到内存中:

$fajl = Import-CSV C:\Users\freeze\Desktop\powershell\formula1.csv

假设CSV具有标题行。如果不是,您可以在导入时指定列名称:

$fajl = Import-CSV C:\Users\freeze\Desktop\powershell\formula1.csv -Header @('H1', 'H2', 'H3', 'H4')

只需使用您想要的任何列名称,使其与数据匹配。

现在我们可以将CSV行用作对象数组。因此,如果我理解你要做什么,这样的循环应该工作(我假设我在上一段代码中使用的标题。当然使用正确的列名称):

$sofor = @()
$pontszam = @()
foreach($row in $fajl){
    $sofor += $row.H2
    $pontszam += $row.H4
    Write-Host $row.H2
    Write-Host $row.H4
}

只是添加一些东西,我怀疑你的初始方法不起作用,因为在你尝试向它添加数组元素之前你没有使$ sofor成为一个数组。我认为在循环之前放置$ sofor = @()可能会解决问题。如果你开始学习使用Powershell中的对象,那么从长远来看你会更开心。