Suponha que eu tenha o seguinte snippet:
$assoc = New-Object psobject -Property @{
Id = 42
Name = "Slim Shady"
Owner = "Eminem"
}
Write-host $assoc.Id + " - " + $assoc.Name + " - " + $assoc.Owner
Eu esperava que esse trecho fosse exibido:
42 - Slim Shady - Eminem
Mas, em vez disso, mostra:
42 + - + Slim Shady + - + Eminem
O que me faz pensar que o +
operador não é apropriado para concatenar seqüências de caracteres e variáveis.
Como você deve abordar isso com o PowerShell?
powershell
string-concatenation
Ninja Cowgirl
fonte
fonte
Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner)
aqui $ assoc.Id é um,Int32
então precisamos usar sua representação de strings. Caso contrário, o PS tenta executar uma adição aritmética em vez de concatenação.Respostas:
Consulte o Windows PowerShell Language Specification versão 3.0 , p34, expansão de subexpressões.
fonte
Write-Output
et al , portanto é provavelmente a mais útil na sua caixa de ferramentas."... $name ..."
funcionará da mesma forma, mas na pergunta original para a qual essa resposta é direcionada, a questão é como acessar as propriedades do objeto. por isso, se$name.id -eq 42
depois"... $name.id ..."
não iria funcionar como você quer porque tornaria como... @{id=42}.id ...
em vez do desejado... 42 ...
Para isso, use o método de resposta"... $($name.id) ..."
. Estou marcando uma pergunta para editar mais tarde.Parece que ninguém mencionou a diferença entre aspas simples e duplas. (Estou usando o PowerShell 4).
Você pode fazer isso (como @Ben disse):
Ou você pode fazer isso:
As aspas simples são literais, produzem a string exatamente assim, por favor. As aspas duplas são para quando você deseja realizar um pré-processamento (como variáveis, caracteres especiais etc.)
Assim:
Enquanto que:
( http://ss64.com/ps/syntax-esc.html acho bom para referência).
fonte
Uma maneira é:
Outro é:
Ou apenas (mas eu não gosto;)):
fonte
$assoc.Id
e"
(et al). Ou seja, a opção 1 forneceId__-__Name__-__Owner
(dois espaços em cada lado de cada um-
), mas a opção 3 forneceId___-___Name___-___Owner
( três espaços).$assoc.Id"###"$assoc.Name
irá adicionar espaços para cada lado do ###, onde"$($assoc.Id)###$($assoc.Name)"
não vai .Você também pode usar
-join
Por exemplo
Atribuiria "John" a $ name.
Então, para saída, em uma linha:
fonte
Tente colocar o que você deseja imprimir entre parênteses:
Seu código está sendo interpretado como muitos parâmetros sendo passados para
Write-Host
. Envolvê-lo entre parênteses concatenará os valores e passará o valor resultante como um único parâmetro.fonte
Write-Debug
ouWrite-Verbose
para incluir aspas duplas e valores variáveis, comoWrite-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))
Outra opção é:
O "melhor" método é provavelmente o que o CB sugeriu:
fonte
StringBuilder
opção se estiver louco por concat. ; ^)Você precisa colocar a expressão entre parênteses para impedir que sejam tratadas como parâmetros diferentes para o cmdlet:
fonte
Enquanto expressão:
concatenará as cordas. Você precisa colocar um $ na frente dos parênteses para fazê-lo avaliar como um único argumento quando passado para um comando do PowerShell. Exemplo:
Como bônus, se você deseja que ele abranja várias linhas, use a sintaxe do backtick desagradável no final da linha (sem espaços ou caracteres à direita do backtick). Exemplo:
(Na verdade, acho que o Powershell está atualmente implementado um pouco errado, pois exige back-ticks desnecessários entre parênteses. Se a Microsoft seguir apenas as regras de parênteses "Python" ou "TCL", permitirá que você coloque quantas linhas novas desejar entre iniciar e terminando entre parênteses, eles resolveriam a maioria dos problemas que as pessoas não gostam sobre o PowerShell relacionados à continuação de linhas e concatenação de strings.Eu descobri que você pode deixar os back-ticks algumas vezes nas continuações de linha entre parênteses, mas é realmente flakey e imprevisível se funcionar. é melhor adicionar apenas os backticks.)
fonte
Aqui está outra maneira como alternativa:
fonte
Eu só quero trazer outra maneira de fazer isso usando o .NET String.Format :
fonte
String.Format
vez da planície antiga"{0}" -f $var
? Eu não vejo o ponto em usar código .NET onde o PowerShell simples pode fazer o trabalho ...(Versão atual do PS 5.1.17134.407)
Já está tudo dito e feito até agora, mas isso também funciona a partir de agora:
Nota: isso funciona apenas com aspas duplas
fonte
Todas essas respostas parecem muito complicadas. Se você estiver usando isso em um script do PowerShell, basta fazer o seguinte:
Vai sair
Observe como um espaço é colocado entre as palavras para você
fonte
Do que fazer / não fazer no PowerShell: Parte 1 :
fonte
Concatene seqüências de caracteres como nos dias do DOS. Este é um grande problema para o registro, então aqui está:
fonte
toString
opção é mais fácil:(Get-Date).toString('yyyyMMdd')
Eu pareço lutar com isso (e muitas outras coisas não intuitivas) toda vez que uso o PowerShell após um tempo fora dele, então agora opto por:
fonte
O Write-Host também pode concatenar assim:
Esta é a maneira mais simples, IMHO.
fonte
fonte
Se você estiver concatenando cadeias para criar caminhos de arquivos, use o comando join-path:
Ele adiciona automaticamente as barras à direita / à direita, o que facilita muito as coisas.
Peço desculpas se este tópico não for muito relevante, mas achei que poderia ajudar alguns.
Se eu não usar o PowerShell por um tempo, às vezes vou esquecer que ele existe e começar a procurar os operadores de concatenação.
fonte
Você também pode obter acesso aos métodos C # / .NET e o seguinte também funciona:
fonte
Apenas pela diversão. Você também pode acessar os valores do PSObject diretamente como abaixo:
Mas se você não especificar que o objeto deve ser pedido, o Powershell exibirá os valores em uma ordem aleatória. Então deve adicionar a bandeira [ordenada]
fonte