Supongamos que tengo el siguiente fragmento:
$assoc = New-Object psobject -Property @{
Id = 42
Name = "Slim Shady"
Owner = "Eminem"
}
Write-host $assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner
Esperaría que este fragmento se muestre:
42 - Slim Shady - Eminem
Pero en cambio muestra:
42 + - + Slim Shady + - + Eminem
Lo que me hace pensar que el +
operador no es apropiado para concatenar cadenas y variables.
¿Cómo debería abordar esto con PowerShell?
powershell
string-concatenation
Vaquera ninja
fuente
fuente
Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner)
aquí $ assoc.Id es un,Int32
así que tenemos que usar su representación de cadena. De lo contrario, PS intenta realizar una suma aritmética en lugar de concatenación.Respuestas:
Consulte la Especificación del lenguaje de Windows PowerShell Versión 3.0 , p34, expansión de subexpresiones.
fuente
Write-Output
et al , por lo que probablemente sea la más útil que tenga en su caja de herramientas."... $name ..."
funcionará de todos modos, pero en la pregunta original a la que se dirige esta respuesta, la pregunta es cómo acceder a las propiedades del objeto. por lo que si$name.id -eq 42
entonces"... $name.id ..."
no funcionaría como que quiere porque haría que al igual que... @{id=42}.id ...
en lugar de la deseada... 42 ...
Para ello, utilizar el método de la respuesta"... $($name.id) ..."
. Estoy marcando una pregunta para editar más tarde.Nadie parece haber mencionado la diferencia entre comillas simples y dobles. (Estoy usando PowerShell 4).
Puedes hacer esto (como dijo @Ben):
O puedes hacer esto:
Las comillas simples son para literal, emite la cadena exactamente así, por favor. Las comillas dobles son para cuando desea que se realice un procesamiento previo (como variables, caracteres especiales, etc.)
Entonces:
Mientras:
( http://ss64.com/ps/syntax-esc.html me parece bueno como referencia).
fuente
Una forma es:
Otro es:
O simplemente (pero no me gusta;)):
fuente
$assoc.Id
y"
(et al). Es decir, la opción 1 le daId__-__Name__-__Owner
(dos espacios a cada lado de cada uno-
), pero la opción 3 le daId___-___Name___-___Owner
( tres espacios).$assoc.Id"###"$assoc.Name
se agregue espacios a ambos lados de la ###, donde"$($assoc.Id)###$($assoc.Name)"
no lo hará .También puedes usar
-join
P.ej
Asignaría "John" a $ name.
Entonces, a la salida, en una línea:
fuente
Intente envolver lo que quiera imprimir entre paréntesis:
Su código se interpreta como muchos parámetros que se pasan
Write-Host
. Envolviéndolo dentro de paréntesis concatenará los valores y luego pasará el valor resultante como un solo parámetro.fuente
Write-Debug
oWrite-Verbose
para incluir comillas dobles y valores variables, comoWrite-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))
Otra opción es:
El "mejor" método es probablemente el que sugirió CB:
fuente
StringBuilder
opción si te estás volviendo loco concat. ; ^)Debe colocar la expresión entre paréntesis para evitar que se traten como parámetros diferentes del cmdlet:
fuente
Mientras que la expresión:
Concatenará las cuerdas. Debe poner un $ delante del paréntesis para que se evalúe como un argumento único cuando se pasa a un comando de PowerShell. Ejemplo:
Como beneficio adicional, si desea que abarque varias líneas, debe usar la sintaxis de retroceso al final de la línea (sin espacios ni caracteres a la derecha del retroceso). Ejemplo:
(En realidad, creo que Powershell se implementa actualmente un poco mal porque requiere retrocesos innecesarios entre paréntesis. Si Microsoft simplemente siguiera las reglas "Python" o "TCL" Paréntesis de permitirle poner tantas líneas nuevas como desee entre el inicio y terminando el paréntesis, entonces resolverían la mayoría de los problemas que a la gente no le gusta sobre PowerShell relacionado con la continuación de línea y la concatenación de cadenas.He descubierto que a veces puede dejar atrás los ticks en las continuaciones de línea entre paréntesis, pero realmente flakey e impredecible si funcionará ... es mejor simplemente agregar los backticks).
fuente
Aquí hay otra forma como alternativa:
fuente
Solo quiero traer otra forma de hacer esto usando .NET String.Format :
fuente
String.Format
lugar del viejo plano"{0}" -f $var
? No veo el punto de usar el código .NET donde PowerShell puede hacer el trabajo ...(Versión actual de PS 5.1.17134.407)
Todo está dicho y hecho ahora, supongo, pero esto también funciona a partir de ahora:
Nota: esto solo funciona con comillas dobles
fuente
Todas estas respuestas parecen muy complicadas. Si está usando esto en un script de PowerShell, simplemente puede hacer esto:
Saldrá
Observe cómo se coloca un espacio entre las palabras para usted
fuente
De qué hacer / no hacer en PowerShell: Parte 1 :
fuente
Concatenar cadenas como en los días de DOS. Este es un gran problema para iniciar sesión, así que aquí tienes:
fuente
toString
opción es más fácil:(Get-Date).toString('yyyyMMdd')
Parece que tengo problemas con esto (y muchas otras cosas poco intuitivas) cada vez que uso PowerShell después de un tiempo alejado de él, así que ahora opto por:
fuente
Write-Host también puede concatenar así:
Esta es la forma más simple, en mi humilde opinión.
fuente
fuente
Si está concatenando cadenas para construir rutas de archivos, use el comando join-path:
Agregará automáticamente las barras inclinadas / iniciales apropiadas para usted, lo que hace las cosas mucho más fáciles.
Pido disculpas si esto está demasiado fuera de tema, pero pensé que podría ayudar a algunos.
Si no uso PowerShell por un tiempo, a veces olvidaré que existe y comenzaré a buscar los operadores de concatenación.
fuente
También puede obtener acceso a los métodos C # / .NET, y lo siguiente también funciona:
fuente
Solo por diversión. También puede acceder a los valores del PSObject directamente como se muestra a continuación:
Pero si no especifica que se debe ordenar el objeto, Powershell mostrará los valores en un orden aleatorio. Entonces debería agregar la bandera [ordenada]
fuente