Deseja exportar a variável CSV com propriedades

2

Eu quero criar uma "tabela" que contenha informações sobre vários computadores (por exemplo, Nome, Endereço IP e Endereço MAC, embora mais informações possam ser adicionadas posteriormente). Aqui está o que eu tenho até agora:

$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++
}

O código acima me fornece as informações que eu quero. No entanto, estou tendo problemas para exportar para arquivo / exibição csv na tabela. Se eu simplesmente digitar: $ComputerInfo . Eu recebo:

Name Value

MAC_ADDR {MAC1, MAC2, MAC3}

IP_ADDR {IP1, IP2, IP3}

NAME {Server1, Server2, Server3}

Não exatamente o que estou procurando. Eu quero algo mais parecido com:

NAME IP_ADDR MAC_ADDR

[value] [value] [value]

[value] [value] [value]

[value] [value] [value]

Se eu exportar $ComputerInfo para o arquivo CSV, ele ficará ainda mais idiota. Eu recebo

TYPE System.Collections.Hashtable "IsReadOnly","IsFixedSize","IsSynchronized","Keys","Values","SyncRoot","Count" "False","False","False","System.Collections.Hashtable+KeyCollection","System.Collections.Hashtable+ValueCollection","System.Object","3"

    
por Delonte Johnson 18.08.2015 / 21:53

2 respostas

1

No geral, eu faria os seguintes ajustes abaixo. Algumas coisas que mudei por aí:

  1. altere o prompt da sua credencial para uma linha, pois Get-Credential pode fornecer uma mensagem
  2. Criamos a tabela como psobject , o que facilita muito o trabalho e a referência a colunas para definir valores.
  3. Ao usar o psobject , elimina a necessidade de indexar na matriz (por exemplo, usando column[0] )
  4. Eu adicionei no teste se o computador estava na rede antes de tentar se conectar para obter informações (apenas boa prática).

Quando quiser adicionar mais colunas à sua tabela, basta expandir a variável $props com suas colunas e preenchê-la no seu loop foreach .

Saída deste script apenas com o meu computador local:

Emseguida,bastamostraroqueseráexibidoseeuapenasConvertTo-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

EDITAR

Uma coisa é apenas acrescentar que você verá uma diferença com o seu $computerinfo versus o meu acima é o TypeName. Se você canalizar para Get-Member , seu objeto retornará como System.Collections.Hashtable , onde o meu retornará como System.Management.Automation.PSCustomObject . O PSCustomObject retornará cada coluna da tabela como um tipo NoteProperty que você pode usar no seu script à medida que você cria nele (por exemplo, consultando o domínio para obter informações sobre o computador).

    
por 19.08.2015 / 08:06
0

O código abaixo faz o que eu preciso fazer. Versão ligeiramente modificada do código fornecida por Shawn Melton. $ComputerInfo alterado para array, ForEach atualizado para adicionar dados à matriz $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
    
por 19.08.2015 / 15:40

Tags