Я хочу создать "~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"
В целом, я бы сделал следующие настройки ниже. Я изменил несколько вещей:
Get-Credential
может предоставить сообщение psobject
, он делает это намного проще работать с столбцами и ссылаться на них для установки значений. psobject
он устраняет необходимость индексировать в массиве (например, используя столбец [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
, который вы можете использовать в своем скрипте по мере его создания (например, запрашивая информацию о компьютере в домене).
Код ниже делает то, что мне нужно. Немного измененная версия кода предоставлена Шоном Мелтоном. $ 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