ডিফল্ট পাওয়ারশেল ls কমান্ডে মানব-পঠনযোগ্য ফাইলের আকারগুলি দেখান


26

আমি কীভাবে পাওয়ারশেলের ডিফল্ট ls( Get-ChildItem) সংশোধন করতে পারি যাতে এটি ls -hএকটি * নিক্স মেশিনের মতো মানব-পঠনযোগ্য ফাইলের আকারকে প্রদর্শন করে?

ls -lh ফাইলের আকারের সাথে সাধারণ যুক্তিযুক্ত করে তোলে, যাতে এটি সত্যিই ছোট ফাইলগুলির জন্য বাইটস দেখায়, 1K এর বেশি ফাইলের জন্য কিলোবাইট (এটি 10K এর নীচে এক দশমিক স্থান সহ) এবং 1 এম এর বেশি ফাইলের জন্য মেগাবাইট (10MB এর নীচে থাকে তবে একটি দশমিক স্থান সহ) ।

উত্তর:


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

আমি অতিরিক্ত সম্পত্তি হিসাবে এটি তৈরি করতে পছন্দ করি। PS3 সংস্করণটি ব্যবহার করার ক্ষেত্রে কেবলমাত্র সমস্যাটিই আমি পেয়েছি: Update-TypeData : Error in TypeData "System.IO.FileInfo": The member DefaultDisplayPropertySet is already present.9/4 থেকে সাম্প্রতিক PS3 সম্পূর্ণ প্রকাশ release
টম মেফিল্ড

3
দুর্দান্ত উত্তর! এটি বিশ্বাস করা শক্ত Get-ChildItemযে বাক্স থেকে এই কাজটি করতে পারে এমন কোনও সুইচ নেই
বেন কলিনস

দুর্দান্ত উত্তর কিন্তু কেউ কি -DefaultDisplayPropertySetকাজ করতে পেয়েছে ?
নিক কক্স

@ টমাসজি.মাইফিল্ডের মতো কাজ করে না।
ChrisBrownie55

14

প্রথমে নিম্নলিখিত ফাংশনটি তৈরি করুন:

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এবং ব্যবহার গণনা সম্পত্তি FILESIZE ফরম্যাট করতে:

Get-ChildItem | Select-Object Name, @{Name="Size";Expression={Format-FileSize($_.Length)}}

অবশ্যই পিবি রেঞ্জের মাপের জন্য এবং আরও অনেক কিছুতে অ্যাকাউন্টের জন্য প্রয়োজনীয়তা হিসাবে দশমিক পয়েন্টের সংখ্যার পরিবর্তনে ফাংশনটি উন্নত করা যেতে পারে।


গ্যাসহিল্ডেম হিসাবে নিজেই এটির জন্য কোনও উপাত্ত তৈরি করা যাবে না (চেকটি-তে একটি -Hh পতাকা বা কিছু আছে এবং যদি তা না হয় তবে কেবল গেট-চাইল্ড আইটেম ব্যবহার করুন, অন্যথায় এটি ব্যবহার করুন)
soandos

আপনি পাইপযুক্ত কমান্ডগুলির জন্য উপকরণ তৈরি করতে পারবেন না, বা ডিফল্ট এলিয়াসগুলিকে ওভাররাইড করতে পারবেন না। আপনি যদি কোনও উপনামের মতো ব্যবহার করে বাঁচতে পারেন তবে ls2অন্য কোনও ফাংশন তৈরি করার চেষ্টা করুন যা প্যারামিটারের উপর ভিত্তি করে আপনি বর্ণিত যুক্তিটি তৈরি করে, তার জন্য একটি উপনাম যুক্ত করুন। উপকরণ তৈরি সম্পর্কে আরও তথ্যের জন্য এখানে দেখুন ।
ইন্দ্রেক

বিকল্পভাবে, cmdlet আউটপুট প্রসারিত করতে কাস্টম বিন্যাস ফাইলগুলি দেখুন look উদাহরণস্বরূপ এই ফোরামের বিষয়টি দেখুন । এছাড়াও, পাওয়ারশেল সেশনের মাধ্যমে ফর্ম্যাট করার কাজটি অবিচল রাখতে, এটি আপনার প্রোফাইল ফাইলে যুক্ত করুন ( Get-Variable profileএর অবস্থানটি দেখুন)।
ইন্দ্রেক

1
আমার জন্য, এই ক্রিয়াটি কাজ ফাইল ~ 2GB চেয়ে বড় করে হিসাবে, $size একটি হিসেবে সংজ্ঞায়িত করা হয় int, যা একটিint32 । এটি বড় ফাইলগুলির সাথে কাজ করার জন্য বা $sizeহিসাবে সংজ্ঞায়িত করুন । int64uint64
অ্যালেক্স লিচ

আমি পেতে Select-Object : Es wurde kein Positionsparameter gefunden, der das Argument "System.Collections.Hashtable" akzeptiert.। আমি কীভাবে পথটি নির্দিষ্ট করতে পারি? আমি ব্যবহার $pst= Get-ChildItem -Path $home_user -Filter *.pst -Recurse -File| Sort-Object Length -Descending | ForEach-Object{ $_.FullName}। এটি কাজ করে তবে ফাইল আকার ছাড়াই।
টিমো

6

কেবল ফাইল আকারের তালিকা তৈরির জন্য নিম্নলিখিতগুলির মতো কিছু। হ্যাঁ এটি চোখের উপর কিছুটা ব্যথা তবে এটি কাজটি পরিচালনা করতে পরিচালনা করে।

কেবি রূপান্তর করার জন্য:

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

এমবিতে রূপান্তর করার জন্য:

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

1
কোনও স্ক্রিপ্ট / ফাংশন ছাড়াই সেরা উত্তর। pipeসমাধান!
টিমো

3

ওয়ালিদ টুমি এর উত্তরের ভিত্তিতে:

করার পদক্ষেপগুলি:

  • নতুন- FileSizeপ্রপার্টি দিয়ে আপনার নিজস্ব টাইপ-ফাইল তৈরি করুন
  • ফাইলআইএনফো-র জন্য স্ট্যান্ডার্ড আউটপুট ফর্ম্যাটটি পরিবর্তন করুন
  • পরিবর্তনগুলি লোড করুন $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>
  • পাওয়ারশেল-সেশনে নতুন সম্পত্তি লোড করুন:

    • Update-TypeData -PrependPath $Env:USERPROFILE\Documents\WindowsPowershell\MyTypes.ps1xml
  • নতুন সম্পত্তি চেষ্টা করুন
    • Get-ChildItem | Format-Table -Property Name, Length, FileSize

ফাইলআইএনফো-র জন্য স্ট্যান্ডার্ড আউটপুট ফর্ম্যাটটি পরিবর্তন করুন

  • আপনার নিজস্ব ফাইল-ফর্ম্যাট-ফাইল তৈরি করুন: 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>

    (এটা মূল সরাসরি কপি allmost এর $PSHOME\FileFormat.format.ps1xml। আমি শুধু পরিবর্তন Lengthকরার FileSizeকয়েক বার)

  • আমাদের পাওয়ারশেল সেশনে নতুন ফর্ম্যাটটি লোড করুন:

    • 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

0

আমি আমার $ প্রোফাইলে একটি উলামের সাথে জেমরিচের সমাধানটি ব্যবহার করেছি:

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

Set-Alias -name megs -val Get-ChildItem-MegaBytes

এখন আমি কেবল টাইপ করি: megs [whatever]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.