Поделиться через


about_Format.ps1xml

Краткое описание

Файлы Format.ps1xml в PowerShell определяют отображение объектов по умолчанию в консоли PowerShell. Вы можете создать собственные Format.ps1xml файлы, чтобы изменить отображение объектов или определить значения по умолчанию для новых типов объектов, создаваемых в PowerShell.

Подробное описание

Файлы Format.ps1xml в PowerShell определяют отображение объектов по умолчанию в PowerShell. Вы можете создать собственные Format.ps1xml файлы, чтобы изменить отображение объектов или определить значения по умолчанию для новых типов объектов, создаваемых в PowerShell.

Когда PowerShell отображает объект, он использует данные в структурированных файлах форматирования для определения отображения объекта по умолчанию. Данные в файлах форматирования определяют, отображается ли объект в таблице или списке, и определяет, какие свойства отображаются по умолчанию.

Форматирование влияет только на отображение. Это не влияет на то, какие свойства объекта передаются по конвейеру или как они передаются. Format.ps1xml Файлы нельзя использовать для настройки формата выходных данных для хэш-таблиц.

PowerShell включает семь файлов форматирования. Эти файлы находятся в каталоге установки ($PSHOME). Каждый файл определяет отображение группы объектов Microsoft платформа .NET Framework:

  1. Certificate.Format.ps1xml

    Объекты в хранилище сертификатов, такие как сертификаты X.509 и хранилища сертификатов.

  2. DotNetTypes.Format.ps1xml

    Другие платформа .NET Framework типы, такие как CultureInfo, FileVersionInfo и объекты EventLogEntry.

  3. FileSystem.Format.ps1xml

    Объекты файловой системы, такие как файлы и каталоги.

  4. Help.Format.ps1xml

    Просмотры справки, такие как подробные и полные представления, параметры и примеры.

  5. PowerShellCore.Format.ps1xml

    Объекты, созданные основными командлетами PowerShell, например Get-Member и Get-History.

  6. PowerShellTrace.Format.ps1xml

    Объекты трассировки, такие как созданные командлетом Trace-Command .

  7. Registry.Format.ps1xml

    Объекты реестра, такие как ключи и записи.

Файл форматирования может определить четыре разных представления каждого объекта:

  • Таблица
  • List
  • Широк.
  • Пользовательское

Например, когда выходные данные Get-ChildItem команды передаются Format-List в команду, использует представление в FileSystem.Format.ps1xml файле, Format-List чтобы определить, как отображать объекты файлов и папок в виде списка.

Если файл форматирования включает несколько представлений объекта, PowerShell применяет первое представление, которое он находит.

Format.ps1xml В файле представление определяется набором XML-тегов, описывающих имя представления, тип объекта, к которому он может применяться, заголовки столбцов и свойства, отображаемые в тексте представления. Формат в Format.ps1xml файлах применяется непосредственно перед представлением данных пользователю.

Создание новых файлов Format.ps1xml

.ps1xml Файлы, установленные с помощью PowerShell, имеют цифровую подпись, чтобы предотвратить изменение, так как форматирование может включать блоки скриптов. Чтобы изменить формат отображения существующего представления объектов или добавить представления для новых объектов, создайте собственные Format.ps1xml файлы и добавьте их в сеанс PowerShell.

Чтобы создать новый файл, скопируйте существующий Format.ps1xml файл. Новый файл может иметь любое имя, но у него должно быть .ps1xml расширение имени файла. Новый файл можно поместить в любой каталог, доступный Для PowerShell, но удобно разместить файлы в каталоге установки PowerShell или$PSHOME в подкаталоге каталога установки.

Чтобы изменить форматирование текущего представления, найдите представление в файле форматирования и используйте теги для изменения представления. Чтобы создать представление для нового типа объекта, создайте новое представление или используйте существующее представление в качестве модели. Теги описаны в следующем разделе. Затем вы можете удалить все остальные представления в файле, чтобы изменения были очевидны для всех, кто изучает файл.

После сохранения изменений используйте Update-FormatData командлет, чтобы добавить новый файл в сеанс PowerShell. Если представление должно иметь приоритет над представлением, определенным в встроенных файлах, используйте параметр PrependPath . Update-FormatData влияет только на текущий сеанс. Чтобы внести изменения во все будущие сеансы, добавьте Update-FormatData команду в профиль PowerShell.

Пример. Добавление данных календаря в объекты языка и региональных параметров

В этом примере показано, как изменить форматирование объектов языка и региональных параметров System.Globalization.CultureInfo , Get-Culture созданных командлетом в текущем сеансе PowerShell. Команды в примере добавляют свойство Calendar в представление таблицы по умолчанию для объектов языка и региональных параметров.

Первым шагом является поиск Format.ps1xml файла, содержащего текущее представление объектов языка и региональных параметров. Select-String Следующая команда находит файл:

$Parms = @{
  Path = "$PSHOME\*Format.ps1xml"
  Pattern = "System.Globalization.CultureInfo"
}

Select-String @Parms
C:\Windows\System32\WindowsPowerShell\v1.0\DotNetTypes.format.ps1xml:113:
     <Name>System.Globalization.CultureInfo</Name>
C:\Windows\System32\WindowsPowerShell\v1.0\DotNetTypes.format.ps1xml:115:
<TypeName>System.Globalization.CultureInfo</TypeName>

Эта команда показывает, что определение находится в DotNetTypes.Format.ps1xml файле.

Следующая команда копирует содержимое файла в новый файл MyDotNetTypes.Format.ps1xml.

Copy-Item $PSHome\DotNetTypes.format.ps1xml MyDotNetTypes.Format.ps1xml

Откройте файл в любом xml-редакторе или текстовом редакторе MyDotNetTypes.Format.ps1xml , например Visual Studio Code. Найдите раздел объекта System.Globalization.CultureInfo. Следующий XML-код определяет представления объекта CultureInfo . Объект имеет только представление TableControl .

<View>
  <Name>System.Globalization.CultureInfo</Name>
  <ViewSelectedBy>
    <TypeName>Deserialized.System.Globalization.CultureInfo</TypeName>
    <TypeName>System.Globalization.CultureInfo</TypeName>
  </ViewSelectedBy>
  <TableControl>
    <TableHeaders>
      <TableColumnHeader>
        <Width>16</Width>
      </TableColumnHeader>
      <TableColumnHeader>
        <Width>16</Width>
      </TableColumnHeader>
    </TableHeaders>
    <TableRowEntries>
      <TableRowEntry>
        <TableColumnItems>
          <TableColumnItem>
            <PropertyName>LCID</PropertyName>
          </TableColumnItem>
          <TableColumnItem>
            <PropertyName>Name</PropertyName>
          </TableColumnItem>
          <TableColumnItem>
            <PropertyName>DisplayName</PropertyName>
          </TableColumnItem>
        </TableColumnItems>
      </TableRowEntry>
    </TableRowEntries>
  </TableControl>
</View>

Удалите оставшуюся часть файла, за исключением открывающих<?xml><Configuration>, и тегов, <ViewDefinitions> а также закрытия <ViewDefinitions> и <Configuration> тегов. При наличии цифровой подписи удалите его из пользовательского Format.ps1xmlфайла.

Теперь MyDotNetTypes.Format.ps1xml файл должен выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
<ViewDefinitions>
<View>
  <Name>System.Globalization.CultureInfo</Name>
  <ViewSelectedBy>
    <TypeName>Deserialized.System.Globalization.CultureInfo</TypeName>
    <TypeName>System.Globalization.CultureInfo</TypeName>
  </ViewSelectedBy>
  <TableControl>
    <TableHeaders>
      <TableColumnHeader>
        <Width>16</Width>
      </TableColumnHeader>
      <TableColumnHeader>
        <Width>16</Width>
      </TableColumnHeader>
      <TableColumnHeader/>
    </TableHeaders>
    <TableRowEntries>
      <TableRowEntry>
        <TableColumnItems>
          <TableColumnItem>
            <PropertyName>LCID</PropertyName>
          </TableColumnItem>
          <TableColumnItem>
            <PropertyName>Name</PropertyName>
          </TableColumnItem>
          <TableColumnItem>
            <PropertyName>DisplayName</PropertyName>
          </TableColumnItem>
        </TableColumnItems>
      </TableRowEntry>
    </TableRowEntries>
  </TableControl>
</View>
</ViewDefinitions>
</Configuration>

Создайте столбец для свойства Calendar , добавив новый набор тегов <TableColumnHeader> . Значение свойства Calendar может быть длинным, поэтому укажите значение 45 символов в качестве <Width>значения.

<TableHeaders>
  <TableColumnHeader>
    <Width>16</Width>
  </TableColumnHeader>
  <TableColumnHeader>
    <Width>16</Width>
  </TableColumnHeader>
  <TableColumnHeader>
    <Width>45</Width>
  </TableColumnHeader>
  <TableColumnHeader/>
</TableHeaders>

Добавьте новый элемент столбца для календаря в строки таблицы с помощью <TableColumnItem> тегов и <PropertyName тегов:

<TableRowEntries>
  <TableRowEntry>
    <TableColumnItems>
      <TableColumnItem>
        <PropertyName>LCID</PropertyName>
      </TableColumnItem>
      <TableColumnItem>
        <PropertyName>Name</PropertyName>
      </TableColumnItem>
      <TableColumnItem>
        <PropertyName>Calendar</PropertyName>
      </TableColumnItem>
      <TableColumnItem>
        <PropertyName>DisplayName</PropertyName>
      </TableColumnItem>
    </TableColumnItems>
  </TableRowEntry>
</TableRowEntries>

Сохранить и закрыть файл. Используйте Update-FormatData для добавления нового файла форматирования в текущий сеанс PowerShell.

В этом примере используется параметр PrependPath для размещения нового файла в более высоком порядке приоритета, чем исходный файл. Дополнительные сведения см. в разделе Update-FormatData.

Update-FormatData -PrependPath $PSHOME\MyDotNetTypes.Format.ps1xml

Чтобы проверить изменение, введите Get-Culture и просмотрите выходные данные, включающие свойство Calendar .

Get-Culture
LCID Name  Calendar                               DisplayName
---- ----  --------                               -----------
1033 en-US System.Globalization.GregorianCalendar English (United States)

XML-файл в файлах Format.ps1xml

Полное определение схемы можно найти в Format.xsd в репозитории исходного кода PowerShell на GitHub.

Раздел ViewDefinitions каждого Format.ps1xml файла содержит <View> теги, определяющие каждое представление. Типичный <View> тег содержит следующие теги:

  • <Name> определяет имя представления.
  • <ViewSelectedBy> указывает тип объекта или типы, к которым применяется представление.
  • <GroupBy> указывает, как элементы в представлении будут объединяться в группах.
  • <TableControl>, <ListControl>, <WideControl>и <CustomControl> содержат теги, определяющие способ отображения каждого элемента.

Тег ViewSelectedBy

Тег <ViewSelectedBy> может содержать <TypeName> тег для каждого типа объекта, к которому применяется представление. Кроме того, он может содержать <SelectionSetName> тег, ссылающийся на набор выбора, определенный в другом месте с помощью тега <SelectionSet> .

Тег GroupBy

Тег <GroupBy> содержит тег, указывающий <PropertyName> свойство объекта, по которому нужно сгруппировать элементы. Он также содержит <Label> тег, указывающий строку, которая будет использоваться в качестве метки для каждой группы или <CustomControlName> тега, ссылающегося на пользовательский элемент управления, определенный в другом месте с помощью тега <Control> . Тег <Control> содержит <Name> тег и <CustomControl> тег.

TableControlTag

Тег <TableControl> обычно содержит <TableHeaders> и <TableRowEntries> теги, определяющие форматирование для голов и строк таблицы. Тег <TableHeaders> обычно содержит <TableColumnHeader> теги, содержащие <Label><Width>теги и <Alignment> теги. Тег <TableRowEntries> содержит <TableRowEntry> теги для каждой строки в таблице. Тег <TableRowEntry> содержит <TableColumnItems> тег, содержащий <TableColumnItem> тег для каждого столбца в строке. Как правило, <TableColumnItem> тег содержит <PropertyName> либо тег, определяющий свойство объекта, отображаемое в определенном расположении, либо <ScriptBlock> тег, содержащий код скрипта, который вычисляет результат, отображаемый в расположении.

Примечание.

Блоки скриптов также можно использовать в других местах, где можно использовать вычисляемые результаты.

Тег <TableColumnItem> также может содержать тег, указывающий <FormatString> , как будет отображаться свойство или вычисляемые результаты.

Тег ListControl

Тег <ListControl> обычно содержит <ListEntries> тег. Тег <ListEntries> содержит <ListEntry> тег. Тег <ListEntry> содержит <ListItems> тег. Тег <ListItems> содержит <ListItem> теги, содержащие <PropertyName> теги. Теги <PropertyName> указывают свойство объекта, отображаемое в указанном расположении в списке. Если выбор представления определен с помощью набора выбора, <ListControl><ListEntry> теги также могут содержать <EntrySelectedBy> тег, содержащий один или несколько <TypeName> тегов. Эти <TypeName> теги указывают тип объекта, который <ListControl> должен отображать тег.

Тег WideControl

Тег <WideControl> обычно содержит <WideEntries> тег. Тег <WideEntries> содержит один или несколько <WideEntry> тегов. Тег <WideEntry> содержит один <WideItem> тег.

Тег <WideItem> должен содержать <PropertyName> тег или <ScriptBlock> тег. Тег <PropertyName> указывает свойство, отображаемое в указанном расположении в представлении. Тег <ScriptBlock> указывает скрипт для оценки и отображения в указанном расположении в представлении.

Тег <WideItem> может содержать тег, указывающий <FormatString> способ отображения свойства.

Тег CustomControl

Тег <CustomControl> позволяет использовать блок скрипта для определения формата. Тег <CustomControl> обычно содержит <CustomEntries> тег, содержащий несколько <CustomEntry> тегов. Каждый <CustomEntry> тег содержит <CustomItem> тег, который может содержать различные теги, которые указывают содержимое и форматирование указанного расположения в представлении, включая <Text>, <Indentation><ExpressionBinding>и <NewLine> теги.

По умолчанию отображается в Types.ps1xml

Отображение некоторых основных типов объектов по умолчанию определяется в Types.ps1xml файле в каталоге $PSHOME . Узлы называются PsStandardMembers, а дочерние элементы используют один из следующих тегов:

  • <DefaultDisplayProperty>
  • <DefaultDisplayPropertySet>
  • <DefaultKeyPropertySet>

Дополнительные сведения см. в разделе about_Types.ps1xml.

Использование файла Format.ps1xml

Чтобы обнаружить ошибки при загрузке или приложении Format.ps1xml файлов, используйте Trace-Command командлет с любым из следующих компонентов формата в качестве значения параметра Name :

  • FormatFileLoading
  • FormatViewBinding

Дополнительные сведения см. в разделе Trace-Command и Get-TraceSource.

Подписывание файла Format.ps1xml

Чтобы защитить пользователей файла, подпишите файл с помощью цифровой Format.ps1xml подписи. Дополнительные сведения см. в about_Signing.

Пример XML для пользовательского представления "Формат таблицы"

В следующем примере создается пользовательское представление для объектов System.IO.DirectoryInfo и System.IO.FileInfo, созданных Get-ChildItem.Format-Table Пользовательское представление называется mygciview и добавляет столбец CreationTime в таблицу.

Пользовательское представление создается из измененной версии FileSystem.Format.ps1xml файла, который хранится в $PSHOME PowerShell 5.1.

После сохранения пользовательского .ps1xml файла используйте Update-FormatData для включения представления в сеанс PowerShell. В этом примере пользовательское представление должно использовать формат таблицы, в противном случае завершается Format-Table сбоем.

Используйте Format-Table параметр View для указания имени пользовательского представления и форматирования выходных данных таблицы. Пример выполнения команды см. в разделе Format-Table.

$Parms = @{
  Path = "$PSHOME\*Format.ps1xml"
  Pattern = "System.IO.DirectoryInfo"
}
Select-String @Parms
Copy-Item $PSHome\FileSystem.format.ps1xml .\MyFileSystem.Format.ps1xml
Update-FormatData -PrependPath $PSHOME\Format\MyFileSystem.Format.ps1xml

Примечание.

Чтобы соответствовать примеру XML в ограничениях ширины линии, необходимо было сжать некоторые отступы и использовать разрывы строк в коде.

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
    <SelectionSets>
        <SelectionSet>
            <Name>FileSystemTypes</Name>
            <Types>
                <TypeName>System.IO.DirectoryInfo</TypeName>
                <TypeName>System.IO.FileInfo</TypeName>
            </Types>
        </SelectionSet>
    </SelectionSets>
<Controls>
<Control>
<Name>FileSystemTypes-GroupingFormat</Name>
<CustomControl>
 <CustomEntries>
  <CustomEntry>
    <CustomItem>
    <Frame>
    <LeftIndent>4</LeftIndent>
    <CustomItem>
    <Text AssemblyName="System.Management.Automation"
    BaseName="FileSystemProviderStrings"
    ResourceId="DirectoryDisplayGrouping"/>
    <ExpressionBinding>
     <ScriptBlock>
      $_.PSParentPath.Replace("Microsoft.PowerShell.Core\FileSystem::", "")
     </ScriptBlock>
    </ExpressionBinding>
    <NewLine/>
    </CustomItem>
    </Frame>
    </CustomItem>
    </CustomEntry>
 </CustomEntries>
</CustomControl>
</Control>
</Controls>
<ViewDefinitions>
    <View>
    <Name>mygciview</Name>
    <ViewSelectedBy>
        <SelectionSetName>FileSystemTypes</SelectionSetName>
    </ViewSelectedBy>
    <GroupBy>
      <PropertyName>PSParentPath</PropertyName>
      <CustomControlName>FileSystemTypes-GroupingFormat</CustomControlName>
    </GroupBy>
        <TableControl>
            <TableHeaders>
                <TableColumnHeader>
                    <Label>Mode</Label>
                    <Width>7</Width>
                    <Alignment>left</Alignment>
                </TableColumnHeader>
                <TableColumnHeader>
                    <Label>LastWriteTime</Label>
                    <Width>25</Width>
                    <Alignment>right</Alignment>
                </TableColumnHeader>
                <TableColumnHeader>
                    <Label>CreationTime</Label>
                    <Width>25</Width>
                    <Alignment>right</Alignment>
                </TableColumnHeader>
                <TableColumnHeader>
                    <Label>Length</Label>
                    <Width>14</Width>
                    <Alignment>right</Alignment>
                </TableColumnHeader>
                <TableColumnHeader/>
            </TableHeaders>
            <TableRowEntries>
                <TableRowEntry>
                    <Wrap/>
                    <TableColumnItems>
                        <TableColumnItem>
                            <PropertyName>Mode</PropertyName>
                        </TableColumnItem>
                        <TableColumnItem>
                            <ScriptBlock>
                                [String]::Format("{0,10}  {1,8}",
                                    $_.LastWriteTime.ToString("d"),
                                    $_.LastWriteTime.ToString("t"))
                            </ScriptBlock>
                        </TableColumnItem>
                        <TableColumnItem>
                            <ScriptBlock>
                                [String]::Format("{0,10}  {1,8}",
                                    $_.CreationTime.ToString("d"),
                                    $_.LastWriteTime.ToString("t"))
                            </ScriptBlock>
                        </TableColumnItem>
                        <TableColumnItem>
                        <PropertyName>Length</PropertyName>
                        </TableColumnItem>
                        <TableColumnItem>
                            <PropertyName>Name</PropertyName>
                        </TableColumnItem>
                    </TableColumnItems>
                </TableRowEntry>
            </TableRowEntries>
        </TableControl>
    </View>
  </ViewDefinitions>
</Configuration>

См. также