Как преобразовать объект в строку?

#string #powershell #type-conversion

#powershell #powershell-7.0

Вопрос:

Я хочу присвоить имя текущего каталога, чтобы построить путь к параллельному каталогу (для запуска некоторых команд diff).

Однако, когда я делаю это:

 New-Item -ItemType Directory -Name my_test_dir;
Set-Location my_test_dir;
$a = $( Get-Item . | Select-Object Name ); 
write-host( "x${a}x" );
  

Я получаю

x@{Name=my_test_dir}x

вместо того, что я ожидал:

xmy_test_dirx

Итак, как мне «распаковать» имя каталога?


PS — для простоты тестирования я использую:

 mkdir my_test_dir; cd my_test_dir; $a = $( Get-Item . | Select Name ); echo "x${a}x"; cd ..; rmdir my_test_dir
  

Комментарии:

1. Используйте select-object -expand name . Объекты имеют пары свойство / значение, если они не являются примитивами. Итак, вы должны сделать что-то другое, чтобы получить только значение. Другой способ — использовать доступ участника: $a.name

2. Чтобы сэкономить накладные расходы на конвейер, вы можете получить имя, подобное этому: $a = (Get-Item .).Name

Ответ №1:

При использовании ... |Select-Object PropertyName он создает объект со свойством с именем PropertyName , копируя значение из соответствующего свойства в элементе ввода.

Используйте Select-Object -ExpandProperty PropertyName или ForEach-Object MemberName , чтобы получить только значение свойства:

 $a = Get-Item . | Select-Object -ExpandProperty Name 
# or 
$a = Get-Item . | ForEach-Object Name
  

… или ссылаться на свойство напрямую:

 $a = (Get-Item .).Name