Я пытаюсь расширить тип настраиваемого объекта с помощью настраиваемого файла types.ps1xml. Файл работает и расширяет многие типы так, как я хочу.
Мне удалось расширить настраиваемый тип с помощью NoteProperty с логическим значением $ true. Все, что я хочу сейчас сделать, это добавить NoteProperty к другому типу со значением TypeName System.Boolean и значением $ false. Моя проблема в том, что свойство <value>
всегда интерпретируется как строка и при приведении к типу TypeName из System.Boolean ВСЕГДА возвращает $ true, потому что любая строка ненулевой длины возвращает $ true.
Я набираю это на своем телефоне и спешу вернуться к работе, но соответствующие части файла ps1xml следующие:
<Type>
<Name>My.Custom.Object</Name>
<Members>
<NoteProperty>
<Name>PSIsContainer</Name>
<TypeName>System.Boolean<TypeName>
<Value>True</Value>
</NoteProperty>
</Members>
</Type>
Это правильно приводит к NoteProperty, который отражает логическое значение $ true. Однако, если я изменю значение на false, или 0, или null, или '', или "", или $ false, или [bool] 0, или любое другое возможное значение с кавычками или без них, с или без $ или внутри $ () или с экранированными кавычками или символами; он ВСЕГДА возвращается как логическое значение $ true. Если я оставлю поле <Value>
пустым, при загрузке xml будет выдана ошибка, так что это тоже не сработает. Если я изменю <TypeName>
на что-то другое, например System.IO.File или что-то еще, он фактически преобразует значение «false» в файловый объект с именем «false» или в любой другой тип, указанный в <TypeName>
. Итак, очевидно, что он работает так, как задумано, за исключением того, что я не могу присвоить логическое значение $ false. Неважно что я делаю. Если я вообще оставлю <TypeName>
, по умолчанию будет System.String, и это мне не поможет.
Если вы посмотрите на Get-Member для файла или каталога, вы увидите соответствующее NoteProperty PSIsContainer, равное System.Boolean значению $ true или $ false, в зависимости от; и мой вывод, когда установлен в true, точно такой же, как объект каталога по умолчанию. Это говорит о том, что должна быть возможность установить NoteProperty на $ false.
Я почти забыл, но на самом деле я могу добавить NoteProperty с помощью Add-Member и правильно установить значение $ false, но для работы моего скрипта / инструмента мне нужно, чтобы все экземпляры этого объекта имели это NoteProperty и так использование файла types.ps1xml - единственный способ, который я могу придумать для этого.
Имейте в виду, что объект, для которого я устанавливаю это свойство, является настраиваемым объектом, у которого нет конфликтующих или существующих свойств с таким именем или значением. И не имеет значения, поменяю ли я <Name>
на что-нибудь другое, например "IsAwesome"; он по-прежнему не работает для $ false. Я пробовал искать в существующих файлах types.ps1xml и format.ps1xml, и нет никаких намеков на то, как они это делают. Я много дней искал в Интернете и даже просмотрел некоторые учебники по Powershell, но безрезультатно.
Кто-нибудь может мне помочь !?