如何修改 PowerShell 中的默认值ls
( Get-ChildItem
) 以便它显示人类可读的文件大小,就像ls -h
在 *nix 机器上一样?
ls -lh
对文件大小执行简单的逻辑,以便它显示非常小的文件的字节数、超过 1K 的文件的千字节数(如果低于 10K,则保留一位小数),以及超过 1M 的文件的兆字节数(如果低于 10MB,则保留一位小数)。
答案1
尝试这个
PS> gc c:\scripts\type\shrf.ps1xml
<Types>
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>FileSize</Name>
<GetScriptBlock>
switch($this.length) {
{ $_ -gt 1tb }
{ "{0:n2} TB" -f ($_ / 1tb) }
{ $_ -gt 1gb }
{ "{0:n2} GB" -f ($_ / 1gb) }
{ $_ -gt 1mb }
{ "{0:n2} MB " -f ($_ / 1mb) }
{ $_ -gt 1kb }
{ "{0:n2} KB " -f ($_ / 1Kb) }
default
{ "{0} B " -f $_}
}
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
PS> Update-TypeData -AppendPath c:\scripts\type\shrf.ps1xml -verbose
PS> get-childItem $env:windir | select Name,FileSize,length
PS> # you can paste this in your profile
PS>
您还可以将动态类型数据与 PS3 一起使用:
PS> Update-TypeData -TypeName System.IO.FileInfo -MemberName FileSize -MemberType ScriptProperty -Value {
switch($this.length) {
{ $_ -gt 1tb }
{ "{0:n2} TB" -f ($_ / 1tb) }
{ $_ -gt 1gb }
{ "{0:n2} GB" -f ($_ / 1gb) }
{ $_ -gt 1mb }
{ "{0:n2} MB " -f ($_ / 1mb) }
{ $_ -gt 1kb }
{ "{0:n2} KB " -f ($_ / 1Kb) }
default
{ "{0} B " -f $_}
}
} -DefaultDisplayPropertySet Mode,LastWriteTime,FileSize,Name
答案2
类似下面的代码,仅列出文件大小。是的,这有点伤眼,但它还是能完成任务的。
转换为 KB:
ls | Select-Object Name, @{Name="KiloBytes";Expression={$_.Length / 1KB}}
转换为 MB:
ls | Select-Object Name, @{Name="MegaBytes";Expression={$_.Length / 1MB}}
答案3
首先,创建以下函数:
Function Format-FileSize() {
Param ([int64]$size)
If ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)}
ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)}
ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)}
ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)}
ElseIf ($size -gt 0) {[string]::Format("{0:0.00} B", $size)}
Else {""}
}
Get-ChildItem
然后,您可以通过管道输出Select-Object
并使用计算财产格式化文件大小:
Get-ChildItem | Select-Object Name, @{Name="Size";Expression={Format-FileSize($_.Length)}}
当然,可以改进该功能,以考虑 PB 范围及更大的尺寸,或根据需要改变小数点的数量。
答案4
根据 walid toumi 的回答:
操作步骤:
FileSize
使用新属性创建自己的类型文件- 更改 FileInfo 的标准输出格式
- 加载更改
$PROFILE
FileSize
使用新属性创建自己的类型文件
创建您自己的类型文件:(
MyTypes.ps1xml
我把它放在了$Env:USERPROFILE\Documents\WindowsPowershell
,所以就在我的旁边$PROFILE
)<?xml version="1.0" encoding="utf-8" ?> <Types> <Type> <Name>System.IO.FileInfo</Name> <Members> <ScriptProperty> <!-- Filesize converts the length to a human readable format (kb, mb, gb, tb) --> <Name>FileSize</Name> <GetScriptBlock> switch($this.length) { { $_ -gt 1tb } { "{0:n2} TB" -f ($_ / 1tb) ; break } { $_ -gt 1gb } { "{0:n2} GB" -f ($_ / 1gb) ; break } { $_ -gt 1mb } { "{0:n2} MB " -f ($_ / 1mb) ; break } { $_ -gt 1kb } { "{0:n2} KB " -f ($_ / 1Kb) ; break } default { "{0} B " -f $_} } </GetScriptBlock> </ScriptProperty> </Members> </Type> </Types>
在 powershell-session 中加载新属性:
Update-TypeData -PrependPath $Env:USERPROFILE\Documents\WindowsPowershell\MyTypes.ps1xml
- 尝试新属性
Get-ChildItem | Format-Table -Property Name, Length, FileSize
更改 FileInfo 的标准输出格式
创建您自己的 Fileformat 文件:
MyFileFormat.format.ps1xml
(再次$Env:USERPROFILE\Documents\WindowsPowershell\
)<?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> <!-- ################ GLOBAL CONTROL DEFINITIONS ################ --> <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> <!-- ################ VIEW DEFINITIONS ################ --> <ViewDefinitions> <View> <Name>children</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>FileSize</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> <PropertyName>FileSize</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Name</PropertyName> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> <View> <Name>children</Name> <ViewSelectedBy> <SelectionSetName>FileSystemTypes</SelectionSetName> </ViewSelectedBy> <GroupBy> <PropertyName>PSParentPath</PropertyName> <CustomControlName>FileSystemTypes-GroupingFormat</CustomControlName> </GroupBy> <ListControl> <ListEntries> <ListEntry> <EntrySelectedBy> <TypeName>System.IO.FileInfo</TypeName> </EntrySelectedBy> <ListItems> <ListItem> <PropertyName>Name</PropertyName> </ListItem> <ListItem> <PropertyName>FileSize</PropertyName> </ListItem> <ListItem> <PropertyName>CreationTime</PropertyName> </ListItem> <ListItem> <PropertyName>LastWriteTime</PropertyName> </ListItem> <ListItem> <PropertyName>LastAccessTime</PropertyName> </ListItem> <ListItem> <PropertyName>Mode</PropertyName> </ListItem> <ListItem> <PropertyName>LinkType</PropertyName> </ListItem> <ListItem> <PropertyName>Target</PropertyName> </ListItem> <ListItem> <PropertyName>VersionInfo</PropertyName> </ListItem> </ListItems> </ListEntry> <ListEntry> <ListItems> <ListItem> <PropertyName>Name</PropertyName> </ListItem> <ListItem> <PropertyName>CreationTime</PropertyName> </ListItem> <ListItem> <PropertyName>LastWriteTime</PropertyName> </ListItem> <ListItem> <PropertyName>LastAccessTime</PropertyName> </ListItem> <ListItem> <PropertyName>Mode</PropertyName> </ListItem> <ListItem> <PropertyName>LinkType</PropertyName> </ListItem> <ListItem> <PropertyName>Target</PropertyName> </ListItem> </ListItems> </ListEntry> </ListEntries> </ListControl> </View> <View> <Name>children</Name> <ViewSelectedBy> <SelectionSetName>FileSystemTypes</SelectionSetName> </ViewSelectedBy> <GroupBy> <PropertyName>PSParentPath</PropertyName> <CustomControlName>FileSystemTypes-GroupingFormat</CustomControlName> </GroupBy> <WideControl> <WideEntries> <WideEntry> <WideItem> <PropertyName>Name</PropertyName> </WideItem> </WideEntry> <WideEntry> <EntrySelectedBy> <TypeName>System.IO.DirectoryInfo</TypeName> </EntrySelectedBy> <WideItem> <PropertyName>Name</PropertyName> <FormatString>[{0}]</FormatString> </WideItem> </WideEntry> </WideEntries> </WideControl> </View> <View> <Name>FileSecurityTable</Name> <ViewSelectedBy> <TypeName>System.Security.AccessControl.FileSystemSecurity</TypeName> </ViewSelectedBy> <GroupBy> <PropertyName>PSParentPath</PropertyName> <CustomControlName>FileSystemTypes-GroupingFormat</CustomControlName> </GroupBy> <TableControl> <TableHeaders> <TableColumnHeader> <Label>Path</Label> </TableColumnHeader> <TableColumnHeader /> <TableColumnHeader> <Label>Access</Label> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <TableColumnItems> <TableColumnItem> <ScriptBlock> split-path $_.Path -leaf </ScriptBlock> </TableColumnItem> <TableColumnItem> <PropertyName>Owner</PropertyName> </TableColumnItem> <TableColumnItem> <ScriptBlock> $_.AccessToString </ScriptBlock> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> <View> <Name>FileSystemStream</Name> <ViewSelectedBy> <TypeName>Microsoft.PowerShell.Commands.AlternateStreamData</TypeName> </ViewSelectedBy> <GroupBy> <PropertyName>Filename</PropertyName> </GroupBy> <TableControl> <TableHeaders> <TableColumnHeader> <Width>20</Width> <Alignment>left</Alignment> </TableColumnHeader> <TableColumnHeader> <Width>10</Width> <Alignment>right</Alignment> </TableColumnHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <TableColumnItems> <TableColumnItem> <PropertyName>Stream</PropertyName> </TableColumnItem> <TableColumnItem> <PropertyName>Length</PropertyName> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> </ViewDefinitions> </Configuration>
(几乎都是原版的直接复制
$PSHOME\FileFormat.format.ps1xml
,我只改Length
了FileSize
几次)在我们的 powershell 会话中加载新格式:
Update-FormatData -PrependPath $Env:USERPROFILE\Documents\WindowsPowershell\MyFileFormat.format.ps1xml
- 尝试新属性
Get-ChildItem
加载更改$PROFILE
复制这些行以
$PROFILE
在每个新会话中加载更改# local path to use in this script $scriptpath = Split-Path -parent $MyInvocation.MyCommand.Definition # custom types and formats # currently only System.IO.FileInfo is changed update-TypeData -PrependPath $scriptpath\MyTypes.ps1xml update-FormatData -PrependPath $scriptpath\MyFileFormat.format.ps1xml