¿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?
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.
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).
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
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.
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"))
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)"
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)
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)
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.)
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))
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"
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
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
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")
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.
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
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