【问题标题】:Powershell Data.TablePowershell 数据表
【发布时间】:2013-04-08 11:57:10
【问题描述】:

任何人都可以提供有关 powershell 表的帮助吗?

脚本的工作部分

Function CheckWMI {
Param (
    [Parameter(Mandatory=$True)]
    $Computers

)
        $CheckWMIResults = New-Object system.Data.DataTable
        $Function = $CheckWMIResults.columns.add("ComputerName", [System.Type]::GetType("System.String") )
        $Function = $CheckWMIResults.columns.add("Attempts", [System.Type]::GetType("System.Int32") )
        $Function = $CheckWMIResults.columns.add("Result", [System.Type]::GetType("System.String") )

    ForEach ($Computer in $Computers) {
        $CheckWMIResults.Rows.Add($Computer,"0","Incomplete")
    }

}

CheckWMI "192.168.1.8","192.168.1.7","192.168.1.6"

如您所见,它获取每个 IP 地址并为它们创建单独的行。

现在我该如何选择其中一行并更新它,例如第二行的计数列?

【问题讨论】:

    标签: powershell powershell-2.0 powershell-3.0


    【解决方案1】:

    没有必要为此使用像 DataTable 这样繁重的数据结构。你所需要的只是一个简单的集合,比如一个数组和通用的PSObject。下面重写你上面的脚本,然后将第一台计算机的Result设置为Complete

    Function CheckWMI {
    Param (
        [Parameter(Mandatory=$True)]
        [string[]]$Computers
    
    )
        $CheckWMIResults = @();
    
        ForEach ($Computer in $Computers) {
            $TempResults = New-Object PSObject;
            $TempResults | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value $Computer;
            $TempResults | Add-Member -MemberType NoteProperty -Name "Attempts" -Value 0;
            $TempResults | Add-Member -MemberType NoteProperty -Name "Result" -Value "Incomplete";
            $CheckWMIResults += $TempResults;
        }
        $CheckWMIResults;
    }
    
    $Results = CheckWMI -Computers "192.168.1.8","192.168.1.7","192.168.1.6"
    $Results[0].Result = "Complete";
    $Results;
    

    如果您确实需要类型检查(DataTable 为您提供),请定义您自己的类型。

    add-type @"
    public class WMIResults {
       public string ComputerName;
       public int Attempts;
       public string Result;
    }
    "@
    
    Function CheckWMI {
    Param (
        [Parameter(Mandatory=$True)]
        [string[]]$Computers
    
    )
        $CheckWMIResults = @();
    
        ForEach ($Computer in $Computers) {
            $TempResults = New-Object WMIResults;
            $TempResults.ComputerName = $Computer
            $TempResults.Attempts = 0;
            $TempResults.Result = "Incomplete";
            $CheckWMIResults += $TempResults;
        }
        $CheckWMIResults;
    }
    
    $Results = CheckWMI -Computers "192.168.1.8","192.168.1.7","192.168.1.6"
    $Results[0].Result = "Complete";
    $Results;
    

    请参阅http://blogs.msdn.com/b/powershell/archive/2009/03/11/how-to-create-an-object-in-powershell.aspxGet-Help Add-Type 了解有关第二种方法的更多详细信息(对于琐碎的情况,您可以使用结构而不是类,但classes are generally a better idea)。

    【讨论】:

    • 最后一个问题,如何使用 ComputerName 选择行
    • 搜索集合中其他任何内容的方式相同。 $Results|Where-object{$_.ComputerName -eq "criteria"}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2011-10-08
    • 2011-02-01
    • 2016-10-14
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多