Tengo este fragmento de código:

$servers = Import-Csv "sources.csv"
$computername = $servers.server
$ServiceName = $servers.services

sources.csv contiene lo siguiente ...

Server,Services
BRWS40,winrm
BRWS84,winrm

Entonces tengo un foreach, y el Write-Host está dentro de eso, produce esto:

Write-Host "$computername - $ServiceName" -ForegroundColor black -BackgroundColor red

La salida de arriba que obtengo es:

BRWS40 BRWS84 - winrm winrm

Mientras que yo quería tener una computadora y un servicio por línea.

BRWS40 - winrm

¿Qué estoy haciendo mal?

Modifiqué el código de aquí.

1
yardyy 26 ene. 2016 a las 14:06

2 respuestas

La mejor respuesta

De hecho, debes recorrer tu resultado:

$servers = Import-Csv "sources.csv"

$servers | %{
    $computername = $_.server
    $ServiceName = $_.services

    write-host "$computername - $ServiceName" -foregroundcolor black -backgroundcolor red
}

O use el cmdlet Format-Table:

$servers | Format-Table
1
David Brabant 26 ene. 2016 a las 11:19

$servers = Import-Csv "sources.csv" importa el contenido de sources.csv como una lista de objetos personalizados en la variable $servers.

$computername = $servers.server selecciona el valor de la propiedad server de cada objeto en la variable $computername, generando así una lista de nombres de computadoras.

$ServiceName = $servers.services selecciona el valor de la propiedad services de cada objeto en la variable $ServiceName, generando así una lista de nombres de servicios.

Tenga en cuenta que $array.property solo funcionará en PowerShell v3 y versiones posteriores, porque las versiones anteriores no desenrollan automáticamente la matriz para obtener las propiedades del elemento, sino que intentan acceder a la propiedad del objeto de la matriz en sí. Si la matriz no tiene tal propiedad, el resultado será $null, de lo contrario será el valor de la propiedad de la matriz. De cualquier manera, no será lo que quieres. Para que la expansión de la propiedad funcione en todas las versiones de PowerShell, use Select-Object -Expand o haga eco de la propiedad en una declaración ForEach-Object:

$computername = $servers | Select-Object -Expand server
$computername = $servers | ForEach-Object { $_.server }

Cuando pones variables de matriz en una cadena ("$computername - $ServiceName"), los elementos de la matriz se unen mediante $OFS carácter (espacio de forma predeterminada), por lo que "$computername" se convierte en BRWS40 BRWS84 y "$ServiceName" se convierte en winrm winrm.

Para obtener el nombre de servicio correspondiente para cada computadora, debe procesar $servers en un bucle, por ejemplo:

foreach ($server in $servers) {
  Write-Host ('{0} - {1}' -f $server.Server, $server.Services) ...
}

Si no necesita un formato de salida específico, también puede usar uno de los {{ X0}} cmdlets, por ejemplo Format-Table :

Import-Csv "sources.csv" | Format-Table -AutoSize
2
Ansgar Wiechers 26 ene. 2016 a las 12:55