¿Cómo concateno cadenas y variables en PowerShell?


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 mostrara:

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 debe abordar esto con PowerShell?

Author: Peter Mortensen, 2013-02-27

16 answers

Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"

Consulte la Especificación del lenguaje de Windows PowerShell Versión 3.0, p34, expansión de subexpresiones.

 388
Author: David Brabant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-18 19:32:01

Nadie parece haber mencionado la diferencia entre comillas simples y dobles. (Estoy usando PowerShell 4).

Puedes hacer esto (como @Ben dijo):

$name = 'Slim Shady'
Write-Host 'My name is'$name
-> My name is Slim Shady

O puedes hacer esto:

$name = 'Slim Shady'
Write-Host "My name is $name"
-> My name is Slim Shady

Las comillas simples son para literal, muestra la cadena exactamente como esta, por favor. Las comillas dobles son para cuando desea que se realice algún preprocesamiento (como variables, caracteres especiales etc)

Así que:

$name = "Marshall Bruce Mathers III"
Write-Host "$name"
-> Marshall Bruce Mathers III

Considerando lo siguiente:

$name = "Marshall Bruce Mathers III"
Write-Host '$name'
-> $name

(http://ss64.com/ps/syntax-esc.html me parece bueno para referencia).

 126
Author: TinyRacoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-08 13:01:28

Una forma es:

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"

Otro es:

Write-host  ("{0}  -  {1}  -  {2}" -f $assoc.Id,$assoc.Name,$assoc.Owner )

O, simplemente, pero no me gusta ;) ):

Write-host $assoc.Id  "  -  "   $assoc.Name  "  -  "  $assoc.Owner
 102
Author: CB.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-12 18:24:09

Intenta envolver lo que quieras imprimir entre paréntesis:

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)

Su código se interpreta como muchos parámetros que se pasan a Write-Host. Envolverlo entre paréntesis concatenará los valores y luego pasará el valor resultante como un solo parámetro.

 38
Author: goric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-27 13:37:39

Para concatenar dos cadenas para almacenar en una variable/usar en una función, puede usar-join.

Por ejemplo

$name = -join("Jo", "h", "n");

Asignaría "John" a name name.

Así que para la salida, en una línea:

Write-Host (-join("Jo", "h", "n"))
 34
Author: manyways,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-19 19:07:05

Otra opción es:

$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string

El "mejor" método es probablemente el que C. B. sugirió:

Write-host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"
 18
Author: Frode F.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-21 15:26:13

Debe colocar la expresión entre paréntesis para evitar que se traten como parámetros diferentes del cmdlet:

Write-host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)
 14
Author: Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-13 17:46:25

Aquí hay otra forma como alternativa:

Write-host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
 10
Author: Dave Sexton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-27 13:42:57

Expresión While:

"string1" + "string2" + "string3"

Concatena las cadenas. Debe poner un $ delante del paréntesis para que se evalúe como un único argumento cuando se pasa a un comando de Powershell. Ejemplo:

Write-Host $( "string1" + "string2" + "string3" ) 

Como beneficio adicional, si desea que abarque varias líneas, entonces necesita usar la sintaxis del backtick de ackward al final de la línea (sin espacios ni caracteres a la derecha del backtick). Ejemplo:

Write-Host $(`
    "The rain in "        +`
    "Spain falls mainly " +`
    "in the plains"       )`
    -ForegroundColor Yellow

(En realidad, creo que Powershell está implementado actualmente un poco mal por requiere back-ticks innecesarios entre paréntesis. Si Microsoft solo siguiera las reglas de paréntesis" Python "o" TCL " para permitirle poner tantas líneas nuevas como desee entre paréntesis de inicio y fin, entonces resolverían la mayoría de los problemas que a la gente no le gustan de powershell relacionados con la continuación de línea y la concatenación de cadenas. He encontrado que usted puede dejar la parte posterior-garrapatas apagado a veces en la línea continuaciones entre paréntesis, pero su realmente escamoso e impredecible si va a funcionar.. es mejor añadir los bastones.)

 9
Author: Bill Moore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-11 00:22:34

Solo quiero traer otra forma de hacer esto usando la cadena.NET .Formato:

$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
 7
Author: Martin Brandl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-26 18:11:40

De Qué Hacer / No Hacer en PowerShell: Parte 1:

$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
 6
Author: Mad Tom Vane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-12 18:25:52

Todas estas respuestas parecen muy complicadas. Si está usando esto en un script de PowerShell, simplemente puede hacer esto:

$name = 'Slim Shady'
Write-Host 'My name is'$name

Saldrá

Mi nombre es Slim Shady

Observe cómo se pone un espacio entre las palabras para usted

 6
Author: elev8ed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-12 18:26:35

Concatenar cadenas como en los días DOS. Esto es un gran problema para el registro, así que aquí tienes:

$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"

Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
 4
Author: Kelly Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-07 18:42:11

Parece que tengo problemas con esto (y muchas otras cosas poco intuitivas) cada vez que uso PowerShell después de un tiempo lejos de él, así que ahora opto por:

[string]::Concat("There are ", $count, " items in the list")
 2
Author: Luke Puplett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-19 08:23:11

Write-Host puede concatenar así también:

Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner

Esta es la forma más sencilla, en mi humilde opinión.

 2
Author: Mordechai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-17 12:50:46

Prueba esto:

$name = "Slim Shady"
Write-Host "My name is " $name
 -5
Author: Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 16:54:21