#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