Ошибка преобразования типа в функции 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"
Надеюсь, это поможет!