2011-05-15 8 views
11

Soy muy nuevo en el scripting de PowerShell y estaba experimentando con Function. Este es el código que he escrito:Problema de conversión de tipo en una función de PowerShell

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

Y trató de llamar usando Add 1,2,3. Sin embargo, cuando ejecuto recibo el siguiente error:

Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Int32".

¿Alguna idea de cómo solucionar esto?

Respuesta

18

gran trampa en Powershell "" es el operador gama sólo tratar en la línea de comandos:

PS> 1,2,3 

Verá la matriz

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

Así que trate de llamar:

PS> Add 1 2 3 
Sum is 6 

Y no olvides que todo es OBJETO en Pow ershell que está jugando en la parte superior de .NET

Así que tienes dos Freinds:

  1. El método gettype() que le da el tipo de un objeto
  2. El Get-Member cmdlet que ayuda en propiedades y métodos de un objeto

Los miembros de Get tienen muchos parámetros que pueden ayudar.

+0

Gracias ..Soy de fondo C++ y no lo pensé dos veces antes de llamar a la función con el parámetro separado por ',' – Naveen

3

fundición se lleva a cabo normalmente asignar el tipo en el lado derecho:

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

Podría ser este el problema?


Segunda observación:

Como ha observado @JPBlanc, que están pasando un array a su función, no tres parámetros. Use:

 
Add 1 2 3 

y lo obtendrá. De todos modos, no necesitas casting en esta situación. Puede estar en esto:

 
Add "1" "2" "3" 

Obviamente se puede seguir llamando a su función como Add 1,2,3, pero hay que cambiarlo de la siguiente manera:

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

Mira un poco más Empo @Naveen cometió un nuevo error que intentó llamar con una matriz como parámetro a pesar de pasar los parámetros. – JPBlanc

+0

Sí, error newby error c migrante :) –

+0

Aún necesitará "," cuando llame a métodos de objeto con parámetros. Realmente es una trampa en PowerShell Newby o viene de cualquier langue. – JPBlanc

0

El código que funciona y muestra cómo manejar los problemas de conversión se muestran a continuación

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

Espero que esto ayude!

Cuestiones relacionadas