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

1

Quando executo isso no powershell, ele exibe o nome dos meus arquivos (nesse caso, apenas um), sem 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.

    
por Rory 10.04.2015 / 12:55

1 resposta

1

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

Se você quiser selecionar o atributo name, você pode fazer assim:

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

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

Uma abordagem melhor para isso seria:

gci test.* | select name

Por que você quer transformá-lo em uma string que elimina a ligação de parâmetros orientada a objeto dos pipelines?

Editar:

A melhor abordagem é a saída de material 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
}
    
por 10.04.2015 / 13:10

Tags