如何更改FileInfo和DirectoryInfo的默认视图?

问题描述 投票:0回答:1

我想设置一个在Powershell中显示FileInfo和DirectoryInfo对象的默认策略,以仅显示文件路径。

默认行为

PS C:\Users\user> gci

    Directory: C:\Users\user

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2023-04-05     1:29                .cache
d----          2023-03-30    22:41                .dbus-keyrings
d----          2023-04-15    22:32                .docker
d----          2023-07-12    15:22                .gfclient
d----          2023-04-04     4:41                .gradle
d----          2023-04-16     0:30                .keras
-a---          2023-09-08    14:36          10629 _viminfo
-a---          2023-02-09    21:03              2 --help
-a---          2023-07-21    14:57          13675 .bash_history

期望的行为

PS C:\Users\user> gci
C:\Users\user\.cache
C:\Users\user\.dbus-keyrings
C:\Users\user\.docker
C:\Users\user\.gfclient
C:\Users\user\.gradle
C:\Users\user\.keras
C:\Users\user\_viminfo
C:\Users\user\--help
C:\Users\user\.bash_history

可以通过将

| % fullname
附加到命令来实现所需的行为,这将打印管道中每个对象的
fullname
属性,但我需要一个 powershell 自定义视图,每次这些类型的对象最终出现在管道末端。

我尝试过的事情

我认为我的问题是通过为适当的对象类型创建自定义视图并将此视图指定为默认视图来解决。

  • 这是关于此事的官方帮助:
    get-help about_format.ps1xml
  • 此命令使用所需类型的默认格式设置创建 xml 文件:
    Get-FormatData -TypeName system.io.fileinfo | Export-FormatData -Path formatOrigFile.ps1xml

这是我通过更改默认文件创建的格式文件:

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
  <ViewDefinitions>
    <View>
      <Name>children</Name>
      <ViewSelectedBy>
        <TypeName>System.IO.DirectoryInfo</TypeName>
      </ViewSelectedBy>
      <!-- <GroupBy>
        <PropertyName>PSParentPath</PropertyName>
      </GroupBy> -->
      <TableControl>
        <TableHeaders>
          <TableColumnHeader />
        </TableHeaders>
        <TableRowEntries>
          <TableRowEntry>
            <Wrap />
            <TableColumnItems>
              <TableColumnItem>
                    <ScriptBlock>$_ | Resolve-Path -Relative</ScriptBlock>
                </TableColumnItem>
            </TableColumnItems>
          </TableRowEntry>
        </TableRowEntries>
        <HideTableHeaders>true</HideTableHeaders>
      </TableControl>
    </View>
    
    
    <View>
      <Name>childrenWithHardlink</Name>
      <ViewSelectedBy>
        <TypeName>System.IO.DirectoryInfo</TypeName>
      </ViewSelectedBy>
      <!-- <GroupBy>
        <PropertyName>PSParentPath</PropertyName>
      </GroupBy> -->
      <TableControl>
        <TableHeaders>
          <TableColumnHeader />
        </TableHeaders>
        <TableRowEntries>
          <TableRowEntry>
            <Wrap />
            <TableColumnItems>
              <TableColumnItem>
                <ScriptBlock>$_ | Resolve-Path -Relative</ScriptBlock>
              </TableColumnItem>
            </TableColumnItems>
          </TableRowEntry>
        </TableRowEntries>
        <HideTableHeaders>true</HideTableHeaders>
      </TableControl>
    </View>
    
    
    <View>
      <Name>children</Name>
      <ViewSelectedBy>
        <TypeName>System.IO.DirectoryInfo</TypeName>
      </ViewSelectedBy>
      <!-- <GroupBy>
        <PropertyName>PSParentPath</PropertyName>
      </GroupBy> -->
      <ListControl>
        <ListEntries>
          <ListEntry>
            <ListItems>
              <ListItem>
                <ScriptBlock>$_ | Resolve-Path -Relative</ScriptBlock>
              </ListItem>
            </ListItems>
          </ListEntry>
          <ListEntry>
            <EntrySelectedBy>
              <TypeName>System.IO.FileInfo</TypeName>
            </EntrySelectedBy>
            <ListItems>
              <ListItem>
                <ScriptBlock>$_ | Resolve-Path -Relative</ScriptBlock>
              </ListItem>
            </ListItems>
          </ListEntry>
        </ListEntries>
        <!-- <HideTableHeaders>true</HideTableHeaders> -->
      </ListControl>
    </View>
    <View>
      <Name>children</Name>
      <ViewSelectedBy>
        <TypeName>System.IO.DirectoryInfo</TypeName>
      </ViewSelectedBy>
      <!-- <GroupBy>
        <PropertyName>PSParentPath</PropertyName>
      </GroupBy> -->
      <WideControl>
        <WideEntries>
          <WideEntry>
            <WideItem>
              <ScriptBlock>$_ | Resolve-Path -Relative</ScriptBlock>
            </WideItem>
          </WideEntry>
          <WideEntry>
            <EntrySelectedBy>
              <TypeName>System.IO.DirectoryInfo</TypeName>
            </EntrySelectedBy>
            <WideItem>
              <ScriptBlock>$_ | Resolve-Path -Relative</ScriptBlock>
            </WideItem>
          </WideEntry>
        </WideEntries>
        <!-- <HideTableHeaders>true</HideTableHeaders> -->
      </WideControl>
    </View>
  </ViewDefinitions>
</Configuration>

这就是它的加载方式:

Update-FormatData -PrependPath C:\Users\user\Desktop\format.ps1xml

之后,

gci
产生了以下结果,而不是期望的行为:

PS C:\Users\user> gci

..\.cache
..\.dbus-keyrings
..\.docker
..\.gfclient
..\.gradle
..\.keras

LastWriteTime : 2023-09-08 14:36:29
Length        : 10629
Name          : _viminfo


LastWriteTime : 2023-07-21 14:57:46
Length        : 13675
Name          : .bash_history


LastWriteTime : 2023-07-20 13:15:58
Length        : 101
Name          : .gitconfig


LastWriteTime : 2023-07-05 19:27:42
Length        : 2200
Name          : .h2.server.properties

它仅对目录应用新的视图设置,不适用于文件。

我该如何改变

format.ps1xml
?或者我如何以不同的方式获得我需要的东西?

powershell get-childitem
1个回答
0
投票

正如 @santiago-squarzon 所指出的,answer 上的另一个问题有一个更好的 format.ps1xml 文件模板。 这是我的最终版本:

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
  <ViewDefinitions>
    <View>
      <Name>CustomIODisplay</Name>
      <ViewSelectedBy>
        <TypeName>System.IO.DirectoryInfo</TypeName>
        <TypeName>System.IO.FileInfo</TypeName>
      </ViewSelectedBy>
      <TableControl>
        <TableHeaders>
            <TableColumnHeader>
                <Label>Path</Label>
            </TableColumnHeader>
            <!-- <TableColumnHeader>
                <Label>Length</Label>
            </TableColumnHeader> -->
        </TableHeaders>
        <TableRowEntries>
          <TableRowEntry>
            <Wrap />
            <TableColumnItems>
              <TableColumnItem>
                    <ScriptBlock>
                    # text colors: https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#text-formatting
                    if ($_.PSIsContainer) {
                        $colors = @()
                        # $colors += '32'   #greenFg
                        $colors += '44' #blueBg
                        $colors = $colors -join ';'
                        
                    }
                    $e = [char]27
                   "$e[${colors}m$($_.FullName)${e}[0m"
                    </ScriptBlock>
                </TableColumnItem>
                <!-- <TableColumnItem>
                    <ScriptBlock>$_.length</ScriptBlock>
                </TableColumnItem> -->
            </TableColumnItems>
          </TableRowEntry>
        </TableRowEntries>
        <HideTableHeaders>true</HideTableHeaders>
      </TableControl>
    </View>
  </ViewDefinitions>
</Configuration>

导入:

Update-FormatData -PrependPath .\formatGci2.ps1xml
(它仅更改当前会话的视图,如果需要自动加载,请将其添加到 pwsh 配置文件)。

它实现了所需的行为(仅打印全名),但也将目录的背景颜色更改为蓝色,就像在默认视图中一样。它还具有注释掉的columnHeader和columnItem,因此如果需要,可以很容易地添加新列。

© www.soinside.com 2019 - 2024. All rights reserved.