Как проверить размер элемента и переместить его, если они превышают определенный порог в Powershell - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я работаю над сценарием Powershell, который должен выполнять следующие действия: Проверьте все элементы в папке, если есть элементы более определенного размера (скажем, 10 МБ), создайте папку (с именем «toobig») и переместите эти элементы туда.

Вот мой сценарий:

function delbig {

param (
[parameter (Mandatory=$true)]
 $p
)


$a= Get-ChildItem $p | Where-Object {$_.Length -gt 10000000} | Measure- Object
$a.count


if ($a -gt 0){

    mkdir "$p\tooBig"

}

"$([int]$a)"

}
delbig

Я выяснил, как перемещать элементы и как создать папку, но мое условие if, чтобы решить, следует ли запускать действия, выдает мне следующую ошибку:

Cannot compare "Microsoft.PowerShell.Commands.GenericMeasureInfo" because it is not IComparable.
At C:\Powertest\movbig.ps1:14 char:1
+ if ($a -gt 0){
+ ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NotIcomparable

Cannot convert the "Microsoft.PowerShell.Commands.GenericMeasureInfo" value of type "Microsoft.PowerShell.Commands.GenericMeasureInfo" to type "System.Int32".
At C:\Powertest\movbig.ps1:20 char:4
+ "$([int]$a)"
+    ~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : ConvertToFinalInvalidCastException

Значит, значение в $ a должно быть целым, верно? И мое условие if должно выглядеть, если значение больше 0 (я пробовал также с "0").

Любая помощь будет принята с благодарностью!

С уважением, Герфи

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Это должно сделать работу:

function Move-BigFiles {
    param([parameter(Mandatory=$true)]$Path)

    $tooBigFiles = Get-ChildItem $Path | Where-Object {$_.Length -gt 10MB}
    if ($tooBigFiles) {
        $dest = mkdir "$Path\TooBig" -Force
        $tooBigFiles | Move-Item -Destination $dest
    }
}

Условия PowerShell могут использовать «истинные» значения.Любая непустая коллекция интерпретируется как $true.

Проблема с вашим сценарием - несоответствие типов.$a - это объект типа Microsoft.PowerShell.Commands.GenericMeasureInfo, как результат вызова Measure-Object.Его нельзя сравнить со значением int.

0 голосов
/ 07 сентября 2018

Большое спасибо вам обоим, с вашей помощью у меня теперь есть скрипт, который делает то, что я хочу:

function delbig {

param (
[parameter (Mandatory=$true)]
 $p
)


$toobigfiles= Get-ChildItem $p | Where-Object {$_.Length -gt 10000000} | Measure-Object
$toobigfiles.count


if ($toobigfiles.Count -gt "0"){

    mkdir "$p\tooBig"
}


$toobigfiles= Get-ChildItem $p | Where-Object {$_.Length -gt 10000000}

if ($toobigfiles.Count -gt "0"){

    $toobigfiles | Move-Item -Destination "$p\tooBig"
}

#"$toobigfiles"


}
delbig

Впервые я написал сценарий самостоятельно, и я очень счастлив :) (Начал изучать Powershell около недели назад и никогда не писал ни одного кода в моей жизни)

0 голосов
/ 07 сентября 2018

$a - это экземпляр типа GenericMeasureInfo, который нельзя сравнивать с нулем (целое число). Используйте свойство Count $a для сравнения с нулем:

if ($a.Count -gt 0){
    mkdir "$p\tooBig" 
}

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

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