【问题标题】:Index is out of range powershell索引超出范围 powershell
【发布时间】:2015-07-30 04:59:37
【问题描述】:

我有一个脚本,它构建了一个带有用户将选择的打印机列表的 GUI。 这些打印机也在这样构建的 CSV 文件中: 计算机(打印机名称);知识产权 xxxx;x.x.x.x

我想在一个名为 x 的数组中收集所有选定的值 然后我想获取 CSV 中与所选项目相对应的每个条目,并将其放入另一个名为 y 的数组中 最后,我将 y 数组导出到一个新的 CSV 文件中,该 CSV 文件将用于在域上安装打印机。 我试图从第二步直接走到最后一步,但我做不到。

这里是部分代码:

    $OKButton.Add_Click({
        foreach ($objItem in $objListbox.SelectedItems)
            {$x += $objItem}

    y=@()
    for ($i=0; $i -lt $x.length; $i++)
    {
        $y[$i]=Import-Csv C:\Users\Administrateur\Desktop\Classeur33.csv | Where-Object {$_.Computer -eq $x[$i]}
    }


$y > C:\Users\Administrateur\Desktop\allezjoue.csv

我已经尝试在另一个脚本中使用 3 值 x 数组来实现它,它运行良好,但我确实需要保留允许用户选择他想要的打印机的列表框。

Powershell 总是返回“索引超出范围” 我尝试输入“$y=$x”,以便它们具有相同的范围,但是当我这样做时,它返回我无法在具有“System.string”类型的对象中建立索引。

【问题讨论】:

  • 我将从明显的注释开始,$x 和 $y 是可怕的变量名。接下来我会问到底是什么让你相信 $x 是一个数组?在您发布的代码中,至少您没有将其初始化为数组。
  • 为什么每次 for 循环运行时都导入 csv?我会首先只加载一次 csv(在一个变量中),然后在每个循环中读取它。
  • 我已经在按钮上的事件之前完成了。
  • Where-Object {$_.Computer -eq $x[$i]} 您正在使用 -eq 比较将一个属性值与整个数组进行比较。真诚地怀疑这种情况是否会成立。
  • 关于索引超出范围的具体问题的答案在这里:stackoverflow.com/questions/226596/…。您仍然应该阅读此页面上的许多其他好建议。

标签: arrays powershell indexing range out


【解决方案1】:
  • 这是 PowerShell 并且非常面向对象。使用手头的物品和收藏品。
  • 描述性变量名称是您的朋友。
  • $objListbox.SelectedItems 已经是对象的集合。
  • 将其放入变量中并使用Foreach-Object aka foreach 循环遍历它。
  • Import-CSV 返回对象的集合。

    $Selection = $ObjListbox.SelectedItems  
    $printers = Import-CSV 'C:\Users\Administrateur\Desktop\Classeur33.csv'  
    foreach ($chosen in $Selection) { 
        $printers = $printers | where-object { $_.Computer -eq $Chosen.Name } 
        } 
    $printers | Export-CSV 'C:\Users\Administrateur\Desktop\allezjoue.csv' -NoTypeInformation
    

$Chosen.Name 应该被编辑以符合您在 $Selection 中获得的任何对象。您可以通过$ObjListbox.SelectedItems | Get-Member 对此进行测试,并检查成员以查找具有所选项目名称的属性,然后假设名称与您的 CSV 中的名称匹配,您应该会很好。

  • (附注)将数据存储在本地管理员中并以本地管理员身份运行是不好的做法,即使在您的家庭实验室中也是如此。您的错误将具有本地管理员的权限,并且您的用户将无法运行脚本,因为源/结果文件位于管理员的桌面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多