我尝试从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
答案 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)。创建一个允许CimSession
和Get-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