2015-05-18 176 views
0

我有一个脚本,用于构建一个GUI,其中包含用户将要选择的打印机列表。 这些打印机也是这样构建的CSV文件: 计算机(打印机的名称); IP XXXX,XXXX索引超出范围powershell

我想收集所有在名为x 然后我想在对应于所选项目的CSV每个条目,并把它放在另一个数组名为Ÿ 最后,我的阵列选定的值将y数组导出到将用于在域中安装打印机的新CSV中。 我试图从第二步直接走到最后一步,但我不能。

下面是部分代码:

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

    [email protected]() 
    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”类型。

+0

我将从显而易见的评论开始,$ x和$ y是可怕的变量名称。接下来我会问,究竟是什么让你相信$ x是一个数组?在您发布的代码中,至少不要将其初始化为数组。 – EBGreen

+0

我在按钮上的事件之前完成了它。 – Sami

+0

'Where-Object {$ _。Computer -eq $ x [$ i]}' 您正在使用-eq比较将一个属性值与整个数组进行比较。真诚地怀疑这种情况永远是真的。 – Xalorous

回答

1
  • 这是PowerShell,非常面向对象。使用手头的对象和集合。
  • 描述性变量名称是你的朋友。
  • $objListbox.SelectedItems已经是对象的集合。
  • 把它放在一个变量中,并用Foreach-Object又名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应该被编辑与您在$选择得到任何对象一致。您可以通过$ObjListbox.SelectedItems | Get-Member来测试此项,并检查成员的名称与所选项目的名称,然后假设名称与CSV中的内容相匹配,则应该很好。

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