Хочу к переменной 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}

ИМЯ {Server1, Server2, Server3}

Не точно, что я ищу. Я хочу что-то больше как:

НАЗОВИТЕ IP_ADDR MAC_ADDR

[значение] [значение] [значение]

[значение] [значение] [значение]

[значение] [значение] [значение]

Если я экспортирую $ComputerInfo к файлу CSV это становится еще более глупым. Я добираюсь

Система типов. Наборы. Хеш-таблица "IsReadOnly", "IsFixedSize", "IsSynchronized", "ключи", "значения", "SyncRoot", "считает" "ложь", "ложь", "ложь", "система. Наборы. Hashtable+KeyCollection", "система. Наборы. Hashtable+ValueCollection", "система. Объект", "3"

2
задан 18 August 2015 в 22:53
2 ответа

В целом, я бы сделал следующие настройки ниже. Я изменил несколько вещей:

  1. измените запрос учетных данных на одну строку, так как Get-Credential может предоставить сообщение
  2. Создал таблицу как psobject , он делает это намного проще работать с столбцами и ссылаться на них для установки значений.
  3. При использовании psobject он устраняет необходимость индексировать в массиве (например, используя столбец [0] )
  4. Я добавил при тестировании, был ли компьютер в сети до того, как вы попытаетесь подключиться для получения информации (просто хорошая практика).

Если вы хотите добавить больше столбцов в свою таблицу, просто разверните переменную $ props с вашими столбцами и заполните его в своем цикле foreach .

Вывод этого скрипта только на моем локальном компьютере: enter image description here enter image description here

Затем, чтобы просто показать, что будет выводиться, если я просто ConvertTo-Csv : enter image description here

$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 , который вы можете использовать в своем скрипте по мере его создания (например, запрашивая информацию о компьютере в домене).

1
ответ дан 3 December 2019 в 12:45

Код ниже делает то, что мне нужно. Немного измененная версия кода предоставлена ​​Шоном Мелтоном. $ 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
0
ответ дан 3 December 2019 в 12:45

Теги

Похожие вопросы