Por que $ _. Name inclui o caminho completo quando está entre aspas no Powershell?

1

Quando executo isso no PowerShell, ele gera o nome dos meus arquivos (neste caso, apenas um), sem o caminho completo:

PS C:\dev\temp> gci test.* | % { $_.Name }
test.txt

Quando coloco o nome entre aspas para formatação de string, ele inclui o caminho completo:

PS C:\dev\temp> gci test.* | % { "Name is: $_.Name" }
Name is: C:\dev\temp\test.txt.Name

Que mágica louca está acontecendo aqui? Como posso obter o nome sem o caminho completo e usá-lo entre aspas para formatação? Eu poderia usar, "blah " + $_.Name + " blah"mas isso parece mais feio.

Rory
fonte

Respostas:

1

O PowerShell expande automaticamente as variáveis ​​entre aspas duplas. Em vez de retornar o nome de propriedade do seu objeto, ele retorna o que acha que é o valor que você precisa.

Se você deseja selecionar o atributo name, pode fazê-lo assim:

gci test.* | % { "Name: $($_.Name)" }

Isso força o Powershell a avaliar primeiro a expressão entre chaves, para concatenar apenas sua string e a propriedade name.

Uma abordagem melhor para fazer isso seria a seguinte:

gci test.* | select name

Por que você deseja transformá-lo em uma string que mata a ligação de paramater orientada a objetos dos pipelines?

Editar:

A melhor abordagem é produzir coisas para um arquivo como este:

foreach($file in (gci test.*)) 
{
    ("Name: {0} is here {1}" -f $file.name,$file.fullname) | out-file C:\temp\log.txt -Append -Encoding utf8
}
megamorf
fonte
Obrigado! Você sabe por que ele pensa que eu quero FullName em vez de Name, quando escolhi explicitamente '$ _. Name'?
Rory
Eu quero a string por razões. Este foi um exemplo simples do problema, no meu caso de uso real, estou exibindo o nome dentro de outro texto em um arquivo de saída.
Rory
Ele expande $ _ como objeto e retorna o atributo fullname. Ele não reconhece .name e apenas o trata como uma sequência regular que será anexada ao atributo fullname retornado.
megamorf
Ah, claro. Eu nem tinha notado o '.Name' à direita na saída da minha pergunta, eu estava tão focado no caminho. d'uh. Obrigado.
Rory