powershell 更改类型system.io.directoryinfo.format.ps1xml的默认格式设置视图

2w3rbyxf  于 2023-03-02  发布在  Shell
关注(0)|答案(1)|浏览(134)

我想知道是否有人可以为我指出正确的方向,或者与我分享一个正确配置system.io.directoryinfo.format.ps1xml的工作示例。
阅读about Format.ps1xmlOut-Default的文档文章,我能够弄清楚如何导出默认的“Type”视图格式化程序,修改它们,然后重新导入它们。
但我坚持手动和正确修改此文件
我期待的结果是删除表头以及表头上方打印的目录名

至于属性,应该是:

  • Basename
  • Extension
  • LastAccessTime
  • Directory或父文件夹

因此,我的最终目标是这样的:

在一个示例中,我尝试删除整个节点TableHeaders

<TableHeaders>
          <TableColumnHeader>
            <Label>Mode</Label>
            <Width>7</Width>
            <Alignment>Left</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>LastWriteTime</Label>
            <Width>26</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Length</Label>
            <Width>14</Width>
            <Alignment>Right</Alignment>
          </TableColumnHeader>
          <TableColumnHeader>
            <Label>Name</Label>
            <Alignment>Left</Alignment>
          </TableColumnHeader>
        </TableHeaders>

这给了我这样的观点:

ModeWithoutHardLink LastWriteTimeString LengthString NameString
------------------- ------------------- ------------ ----------
d----               07/02/2023    19:18              Some folder

进一步编辑,然后试图重新导入编辑xml文件只是给我错误:

Update-FormatData: Errors occurred while loading the format data file:

我花了一整天的时间试图理解这一点,我现在已经到了我的智慧极限。任何帮助都将不胜感激!

vltsax25

vltsax251#

您可以使用CustomControl ExpressionBinding Tag来获取您正在查看的ps1xml文件的输出,但是您应该注意,由于您对将对象显示为字符串感兴趣,因此无法使用此方法处理动态填充。
格式化文件应如下所示:

<Configuration>
  <ViewDefinitions>
    <View>
      <Name>CustomIODisplay</Name>
      <ViewSelectedBy>
        <TypeName>System.IO.DirectoryInfo</TypeName>
        <TypeName>System.IO.FileInfo</TypeName>
      </ViewSelectedBy>
      <CustomControl>
        <CustomEntries>
          <CustomEntry>
            <CustomItem>
              <ExpressionBinding>
                <ScriptBlock>
                  '{0,-25}{1,-10}{2,-20:dd/MM/yyyy HH:mm:ss}{3}' -f @(
                      $_.Basename
                      $_.Extension
                      $_.LastAccessTime
                      $_.DirectoryName
                  )
                </ScriptBlock>
              </ExpressionBinding>
            </CustomItem>
          </CustomEntry>
        </CustomEntries>
      </CustomControl>
    </View>
  </ViewDefinitions>
</Configuration>

然后您可以Update-FormatData

Update-FormatData -PrependPath path\to\my\test.format.ps1xml

那么Get-ChildItem更新看起来或多或少就像你想要的:

PS ..\pwsh> Get-ChildItem C:\Windows\ -File | Select-Object -First 10 

bfsvc                    .exe      15/01/2023 19:21:46 C:\Windows
bootstat                 .dat      07/02/2023 15:00:22 C:\Windows
comsetup                 .log      15/08/2021 02:44:15 C:\Windows
Core                     .xml      07/02/2023 10:24:46 C:\Windows
CoreSingleLanguage       .xml      05/02/2023 17:12:19 C:\Windows
diagerr                  .xml      05/02/2023 17:12:19 C:\Windows
diagwrn                  .xml      05/02/2023 17:12:19 C:\Windows
DirectX                  .log      15/08/2021 02:44:15 C:\Windows
DPINST                   .LOG      15/03/2022 13:17:14 C:\Windows
DtcInstall               .log      15/08/2021 02:44:15 C:\Windows

一个简单得多的解决方案是使用Format-Table -HideTableHeaders,然后cmdlet可以为您处理动态填充:

Get-ChildItem C:\Windows\ -File |
    Format-Table Basename, Extension, LastAccessTime, DirectoryName -HideTableHeaders

相关问题