1

Когда я запускаю это в powershell, он выводит имя моих файлов (в данном случае только один) без полного пути:

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

Когда я помещаю имя в кавычки для форматирования строки, оно включает полный путь:

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

Какая сумасшедшая магия здесь происходит? Как я могу получить имя без полного пути и использовать его в кавычках для форматирования? Я мог бы использовать "blah " + $_.Name + " blah" но это выглядит ужаснее.

1 ответ1

1

Powershell автоматически расширяет переменные в двойных кавычках. Вместо того, чтобы возвращать правильность имени вашего объекта, он возвращает то, что считает нужным вам значением.

Если вы хотите выбрать атрибут имени, вы можете сделать это так:

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

Это заставляет Powershell сначала вычислять выражение в фигурных скобках, чтобы оно объединяло только вашу строку и свойство name.

Лучший подход для этого был бы следующим:

gci test.* | select name

Почему вы хотите превратить его в строку, которая убивает привязку объектно-ориентированного параметра конвейера?

Редактировать:

Лучший подход - вывести материал в файл, подобный этому:

foreach($file in (gci test.*)) 
{
    ("Name: {0} is here {1}" -f $file.name,$file.fullname) | out-file C:\temp\log.txt -Append -Encoding utf8
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .