我想设置一个在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
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
?或者我如何以不同的方式获得我需要的东西?
正如 @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,因此如果需要,可以很容易地添加新列。