PowerShell поиск файлов по размеру - PullRequest
2 голосов
/ 01 февраля 2020

Windows поиск позволяет искать файлы по их размеру, вводя поисковый запрос, например size:gigantic или size:large.

Я пытался использовать это с Get-ChildItem:

Get-ChildItem -Path C:\ -Filter "size:large" -Recurse

Однако, похоже, это воспринимается как местоположение и выдает эту ошибку:

The filename, directory name, or volume label syntax is incorrect.

Есть ли способ заставить PowerShell выполнять поиск на моем диске файлов таких контейнеров размера, как определено Windows Поиск вместо того, чтобы реализовать все это сам? А если не PowerShell, может ли Batch сделать это? Или можно вызвать Windows API для Windows поиска (если он есть) из PowerShell для выполнения sh этого?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Для более чем одного файла:

Может быть, вы можете попробовать это:

$size = 0
foreach ($file in (get-childitem <folder -file)> {$size += $file.length}
$size 
0 голосов
/ 01 февраля 2020

Вы можете имитировать c сегменты размера, используя атрибут параметра ValidateSet в такой функции:

function Search-FileBySize {
    [CmdletBinding()]
    param(
        [ValidateSet(
            'Empty (0KB)', 'Tiny (0KB-16KB)', 
            'Small (16KB-1MB)', 'Medium (1MB-128MB)', 
            'Large (128MB-1GB)', 'Huge (1GB-4GB)', 'Gigantic (>4GB)'
        )]
        [Parameter(Mandatory)][string]$size
    );

    $range = $size -replace '^\w+\s+\(([^()]+)\)$', '$1' -split '-' |
             foreach { 
                Invoke-Expression $_.ToString().Replace('>', ''); 
             }

    $condition = if ($range -is [array]) {
        { $args[0] -ge $range[0] -and $args[0] -le $range[1] };
    } else {
        if ($range -gt 0) { { $args[0] -gt $range }; } 
        else { { $args[0] -eq $range }; }
    }

    Get-ChildItem -Path 'c:\' `
                  -Recurse -File `
                  -ErrorAction SilentlyContinue | 
    where { & $condition $_.Length; }
}

PowerShell ISE и другие редакторы кода выберут действительные значения параметров от ValidateSet. Например:

$files = Search-FileBySize -size 'Large (128MB-1GB)';
# Intellisense gives you this    ^^^^^^^^^^^^^^^^^^^

Жестко закодируйте путь Get-ChildItem, чтобы пример был коротким. Если вы находите функцию полезной, возможно, следует добавить параметр пути с проверкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...