我想建立一个“~table”,其中包含有关各种计算机的信息(例如名称、IP 地址和 MAC 地址,尽管以后可以添加更多信息)。以下是我目前所拥有的:
$Computers = "Server1", "Server2", "Server" #Eventually will get from file
$a = $Computers.length
$User = Read-Host "Enter Username"
$Cred = Get-Credential $User
cls
$ComputerInfo = @{NAME = 1..$a; IP_ADDR = 1..$a; MAC_ADDR = 1..$a}
$i = 0
ForEach ($Computer in $Computers) {
$wmiquery = get-wmiobject win32_networkadapterconfiguration -computer $Computer -filter "IPEnabled='True'" -Credential $Cred
$ComputerInfo.NAME[$i] = $Computer
$ComputerInfo.IP_ADDR[$i] = $wmiquery.IPAddress[0]
$ComputerInfo.MAC_ADDR[$i] = $wmiquery.MACAddress
$i++
}
上面的代码为我提供了我想要的信息。但是,我无法导出到 csv 文件/显示在表格中。如果我简单地输入:$ComputerInfo
。我得到:
名称值
MAC_ADDR {MAC1,MAC2,MAC3}
IP_ADDR {IP1,IP2,IP3}
名称 {服务器 1, 服务器 2, 服务器 3}
这不是我想要的。我想要的是类似这样的内容:
名称 IP 地址 MAC 地址
[值] [值] [值]
[值] [值] [值]
[值] [值] [值]
如果我导出$ComputerInfo
到 CSV 文件,情况会变得更加糟糕。我得到
类型 System.Collections.Hashtable“IsReadOnly”、“IsFixedSize”、“IsSynchronized”、“Keys”、“Values”、“SyncRoot”、“Count”“False”、“False”、“False”、“System.Collections.Hashtable+KeyCollection”、“System.Collections.Hashtable+ValueCollection”、“System.Object”、“3”
答案1
总的来说,我会做出以下调整。我改变了以下几点:
- 将您的凭据提示更改为一行,因为
Get-Credential
可以提供一条消息 - 将表创建为
psobject
,这样可以更轻松地使用和引用列来设置值。 - 使用它就
psobject
不需要对数组进行索引(例如使用column[0]
) - 在您尝试连接以获取信息之前,我添加了测试,以查看计算机是否在网络上(这只是一种很好的做法)。
当您想要向表中添加更多列时,只需$props
使用列扩展变量,然后在foreach
循环中填充它。
然后只显示如果我这样做它会输出什么ConvertTo-Csv
:
$UserCred = (Get-Credential -Message "Enter username")
$props = [ordered]@{NAME="";IP_ADDR="";MAC_ADDR=""}
$ComputerInfo = New-Object psobject -property $props
ForEach ($Computer in $Computers) {
if (Test-Connection $computer) {
$wmiquery = get-wmiobject win32_networkadapterconfiguration -computer $Computer -filter "IPEnabled='True'" -Credential $Cred
$ComputerInfo.NAME = $computer
$ComputerInfo.IP_ADDR = $wmiquery.IPAddress[0]
$ComputerInfo.MAC_ADDR = $wmiquery.MACAddress
}
else{
Write-Warning "$($computer) not found on the network"
}
}
$ComputerInfo
编辑
需要补充的是,您会看到$computerinfo
上面的您的和我的之间的区别是 TypeName。如果您将其通过管道传输到Get-Member
您的对象,将返回为System.Collections.Hashtable
,而我的将返回为System.Management.Automation.PSCustomObject
。PSCustomObject
将返回表中的每一列作为NoteProperty
类型,您可以在脚本中使用它来构建它(例如查询域以获取计算机信息)。
答案2
下面的代码可以完成我需要它做的事情。Shawn Melton 提供的代码经过了轻微修改。更改$ComputerInfo
为数组,ForEach
更新为将数据添加到$ComputerInfo
数组中。
$Computers = "Server1", "Server2, Server3"
$a = $Computers.length
$Cred = (Get-Credential)
$i=0
$ComputerInfo = 1..$a
$props = @{NAME = ""; IP_ADDR = ""; MAC_ADDR = ""}
ForEach ($Computer in $Computers) {
$ComputerInfo[$i] = New-Object psobject -property $props
$wmiquery = get-wmiobject win32_networkadapterconfiguration -computer $Computer -filter "IPEnabled='True'" -Credential $Cred
$ComputerInfo[$i].NAME = $computer
$ComputerInfo[$i].IP_ADDR = $wmiquery.IPAddress[0]
$ComputerInfo[$i].MAC_ADDR = $wmiquery.MACAddress
$i++
}
$ComputerInfo