Проблема преобразования типов в функции PowerShell - PullRequest
11 голосов
/ 15 мая 2011

Я очень плохо знаком со сценариями 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".

Есть идеи, как это исправить?

Ответы [ 3 ]

20 голосов
/ 15 мая 2011

Big 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

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

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

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

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

3 голосов
/ 15 мая 2011

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

$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"}
}
0 голосов
/ 31 января 2013

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

$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"

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

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