Показывать доступные для пользователя размеры файлов в команде PowerShell по умолчанию

Как я могу изменить значение по умолчанию ls ( Get-ChildItem ) в PowerShell, чтобы он отображал доступные для человека размеры файлов, например ls -h на машине * nix?

ls -lh делает простую логику с размером файла, так что он отображает байты для действительно маленьких файлов, килобайты для файлов более 1K (с одним десятичным разрядом, если он меньше 10K), и мегабайты для файлов более 1M (с одним десятичным знаком, если это До 10 МБ).

попробуй это

 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 

Сначала создайте следующую функцию:

 Function Format-FileSize() { Param ([int]$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 и более или для изменения количества десятичных точек по мере необходимости.

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

Для преобразования в KB:

 ls | Select-Object Name, @{Name="KiloBytes";Expression={$_.Length / 1KB}} 

Для преобразования в MB:

 ls | Select-Object Name, @{Name="MegaBytes";Expression={$_.Length / 1MB}} 

Основанный на ответе walid toumi:

Шаги:

  • Создайте свой собственный тип-файл с помощью нового FileSize -Property
  • Изменение стандартного формата вывода для FileInfo
  • Загрузить изменения в $PROFILE

Создайте свой собственный тип-файл с помощью нового FileSize -Property

  • Создайте свой собственный тип-файл: 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:

    • Update-TypeData -PrependPath $Env:USERPROFILE\Documents\WindowsPowershell\MyTypes.ps1xml
  • Попробуйте новое свойство
    • Get-ChildItem | Format-Table -Property Name, Length, FileSize

Изменение стандартного формата вывода для FileInfo

  • Создайте свой собственный файл MyFileFormat.format.ps1xml : 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 . Я несколько раз $PSHOME\FileFormat.format.ps1xml в 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 
Давайте будем гением компьютера.