想要导出具有属性的 CSV 变量

想要导出具有属性的 CSV 变量

我想建立一个“~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

总的来说,我会做出以下调整。我改变了以下几点:

  1. 将您的凭据提示更改为一行,因为Get-Credential可以提供一条消息
  2. 将表创建为psobject,这样可以更轻松地使用和引用列来设置值。
  3. 使用它就psobject不需要对数组进行索引(例如使用column[0]
  4. 在您尝试连接以获取信息之前,我添加了测试,以查看计算机是否在网络上(这只是一种很好的做法)。

当您想要向表中添加更多列时,只需$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.PSCustomObjectPSCustomObject将返回表中的每一列作为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

相关内容