Tengo un archivo csv:

"SamAccountName","UserPrincipalName","Telephonenumber"
"TUser","TUser@domain.com","+15551112222"

Recorro el archivo:

$csvfile = Import-Csv $path
foreach ($row in $csvfile) {
    Write-Host $row.SamAccountName, "$row.SamAccountName"
}

El primer $row.SamAccountName imprime la cadena del nombre de la cuenta sam del archivo csv. Si pongo la misma variable entre comillas, imprime una matriz. Mi salida se ve así:

TUser @{SamAccountName=TUser; UserPrincipalName=TUser@domain.com; Telephonenumber=+15551112222}.SamAccountName

Si hago .GetType() en $row.SamAccountName se dice que es un System.String. Entonces, ¿por qué ponerlo entre comillas imprime una matriz?

0
jes516 23 oct. 2017 a las 18:25

3 respuestas

La mejor respuesta

Cuando lo escribes así:

"$row.SamAccountName"

Solo $row se reconoce como parte de la variable y dado que $row es una matriz que es lo que genera. Si desea escribir todo en una cadena, intente buscar en .ToString() o ajustar su declaración original en una variable como esta:

"$($row.SamAccountName)"

De esa manera considerará todo como parte de la variable.

1
CuriousOne 23 oct. 2017 a las 15:32

Al usar comillas dobles alrededor del "$ row.SamAccountName", le está diciendo a PowerShell que imprima la fila IE, la matriz de objetos de esa fila. Como podemos ver en su salida:

TUser @{SamAccountName=TUser; UserPrincipalName=TUser@domain.com; Telephonenumber=+15551112222}.SamAccountName

Esta es su declaración de host de escritura. Primero, está escribiendo $ row.SamAccountName y segundo está agregando todo el objeto Row, es decir, la matriz. El .SamAccountName en las comillas dobles se toma como una cadena literal, por lo tanto, no está accediendo a la fila para recuperar su valor.

Si solo pone $ row en comillas dobles obtendrá esto:

@{SamAccountName=TUser; UserPrincipalName=TUser@domain.com; Telephonenumber=+15551112222}

Si desea usar comillas dobles alrededor de una variable, use esto si está intentando acceder a una subexpresión.

"$($row.SamAccountName)"

Esta es la forma de subexpresión.

El siguiente enlace es para ayudar a aprender sobre los caracteres de escape y la concatenación de cadenas. https://ss64.com/ps/syntax-esc.html

0
Chanced270 23 oct. 2017 a las 15:41

No está imprimiendo una matriz, está imprimiendo una interpretación textual del objeto.

Si desea interpolar una propiedad de objeto en una cadena, debe usar la sintaxis "$($object.property)". Así que cambiar de la siguiente manera funcionará:

$csvfile = Import-Csv $path
foreach ($row in $csvfile) {
    Write-Host $row.SamAccountName, "$($row.SamAccountName)"
}

O use el operador de cadena de formato:

$csvfile = Import-Csv $path
foreach ($row in $csvfile) {
    "{0}" -f $row.SamAccountName
}
1
arco444 23 oct. 2017 a las 15:38