Ошибка преобразования типа в функции PowerShell

Я очень плохо разбираюсь в сценариях PowerShell и экспериментировал с Function. Это код, который я написал:

Function Add
{
   $sum = 0;
   for($i = 0; $i -le $args.length; ++$i)
   {
     [int] $num = $args[$i]
     $sum += $num
   }
   Write-Output "Sum is $sum"
}

И я попытался позвонить с помощью Add 1,2,3. Однако при выполнении я получаю следующую ошибку:

Невозможно преобразовать "System.Object []" значение типа "System.Object []" на введите "System.Int32".

Любая идея, как это исправить?

Ответ 1

Большая TRAP в Powershell "," является оператором массива просто попробуйте в командной строке:

PS> 1,2,3

Вы увидите массив

PS> (1,2,3).gettype()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

Поэтому попробуйте вызвать:

PS> Add 1 2 3
Sum is 6

И не забывайте, что evergeing является OBJECT в Powershell, который вы играете на вершине .NET.

Итак, у вас есть две freinds:

  • Метод gettype(), который дает вам тип объекта
  • Get-Member CmdLet, который поможет вам в свойствах и методах объекта

Get-член имеет много параметров, которые могут помочь.

Ответ 2

Обычно выполняется кастинг, назначая тип с правой стороны:

$num = [int] $args[$i]

Может быть, это ваша проблема?


Второе наблюдение:

Как заметил @JPBlanc, вы передаете массив своей функции, а не три параметра. Использование:

Add 1 2 3

и вы получите его. Во всяком случае, вам не нужно кастинг в этой ситуации. Может быть в этом:

Add "1" "2" "3"

Очевидно, что вы можете продолжать использовать свою функцию как Add 1,2,3, но вам нужно изменить ее следующим образом:

Function Add {
   args[0] | % {$sum=0}{$sum+=$_}{write-output "Sum is $sum"}
}

Ответ 3

Код, который работает и показывает, как обрабатывать проблемы преобразования, показан ниже

$args = 1,12,13,14,15,16
[int]$sum = 0;
for($i = 0; $i -le $args.length; ++$i)
{
  [int] $num = $args[$i]
  $sum += $num
}
Write-Output "Sum is $sum"

Надеюсь, это поможет!