Powershell想要通过开关创建属性并返回到csv

时间:2017-08-21 17:59:18

标签: powershell

我尝试从get-wmiobject提取默认网关信息,然后使用开关填充信息,在Foreach-object内使用foreach向对象添加新属性1}}。我把头撞在墙上。你能告诉我我做错了吗?

我可以导出CN和DefaultIpgateway,但是location属性和$location变量不会更新。我想让$location变量切换,然后将数据放入$output的位置属性中。

我对Powershell很新。任何帮助表示赞赏。

$hostname = Get-Content -path C:\workspace\location_project\Workspace_818\pcs.txt 
$output = foreach ($h in $hostname) {
    #get-wmiobject will get the comptuer info for each system. 
    get-wmiobject Win32_NetworkAdapterConfiguration -filter "IPEnabled=TRUE" -computername $H | foreach-object {
        new-object PSObject -property @{
           "CN" = $h 
           "DefaultIPGateway" = $_.DefaultIPGateway[0] 
           "Location" = $location ## = $output."DefaultIPGateway"[0])
       }
        switch ($output."DefaultIPGateway") {
           10.10.1.2{$location = "Location1"}
           10.10.1.20{$location = "Locaiton2"}
        }                           
        select-object DefaultIPGateway, CN, Location
    }
}
$output | Export-csv C:\workspace\CN_Gateway_Loc_Get2.csv -NoTypeInformation -force

2 个答案:

答案 0 :(得分:2)

在示例代码中,添加$location对象,当它仍为空时。在将$location添加到对象之前,必须先设置Get-CimInstance

进一步考虑:

  • 使用Get-WmiObject而不是CimSession,因为它默认使用WinRM连接到远程计算机,并将Get-CimInstance作为输入加入,这是最小的占用空间。也许最重要的是:它可以并行查询计算机,这使得完整的脚本在规模上变得非常快!
  • Get-WmiObject(以及foreach)接受多个CimSessions / ComputerNames作为输入,因此您不需要[PSCustomObject]
  • New-Object$hostname = Get-Content -path C:\workspace\location_project\Workspace_818\pcs.txt $csvPath = 'C:\workspace\CN_Gateway_Loc_Get2.csv' $CimSessions = New-CimSession -ComputerName $hostname $NetworkAdapterConfiguration = Get-CimInstance -CimSession $CimSessions -ClassName Win32_NetworkAdapterConfiguration -Filter "IPEnabled=TRUE" $output = foreach ($adapter in $NetworkAdapterConfiguration) { switch ($adapter.DefaultIPGateway[0]) { '10.10.1.2' {$location = 'Location1'} '10.10.1.20' {$location = 'Location2'} default {$location = 'Unknown'} } [PSCustomObject]@{ ComputerName = $adapter.PSComputername DefaultIPGateway = $adapter.DefaultIPGateway[0] Location = $location } } $output | Export-Csv -Path $csvPath -NoTypeInformation -Force

应用这些改进后,您的代码看起来会像这样:

ComputerName

如果这对您有用,我强烈建议您转换script into a tool (Cmdlet)。创建一个允许CimSessionGet-DefaultGateway作为输入的函数。输出将是您已定义的对象。这将允许任何人使用该工具,因为他需要使用它(而不是,你希望他们如何使用它)。如果您的新Cmdlet被称为Get-DefaultGateway -ComputerName (Get-ADComputer).Name | Out-GridView ,您可以执行以下操作:

$CimSessions = Get-Clipboard | New-CimSession
Get-DefaultGateway -CimSession $CimSessions | Export-Csv -Path $env:TEMP\export.csv

XX="1"
YY="2"

答案 1 :(得分:1)

我会做这样的事情。您需要先获取该位置。所以我将$location设置为switch的结果。然后我用你想要的参数创建pscustomobject。您不需要Select-Object,因为这三个属性是对象中的唯一属性。

$hostname = Get-Content -Path C:\workspace\location_project\Workspace_818\pcs.txt 
$output = foreach ($h in $hostname) {
    #get-wmiobject will get the comptuer info for each system. 
    Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IPEnabled=TRUE" -ComputerName $H `
    | ForEach-Object -Process {
        $location = switch ($_.DefaultIPGateway) {
            10.10.1.2  { 'Location1'; break }
            10.10.1.20 { 'Locaiton2'; break }
            default    { 'unknown' }
        }    

        [pscustomobject] @{
            "CN" = $h 
            "DefaultIPGateway" = $_.DefaultIPGateway[0] 
            "Location" = $location 
        }
    }
}
$output | Export-csv C:\workspace\CN_Gateway_Loc_Get2.csv -NoTypeInformation -force