【问题标题】:Type conversion problem in a PowerShell functionPowerShell 函数中的类型转换问题
【发布时间】:2013-01-31 18:27:02
【问题描述】:

我对 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”。

知道如何解决这个问题吗?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    Powershell 中的 Big TRAP "," 是数组运算符 只需在命令行尝试:

    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
    

    别忘了你在 .NET 上玩的 Powershell 中的一切都是 OBJECT

    所以你有两个朋友:

    1. gettype() 方法为您提供对象的类型
    2. Get-Member CmdLet 可帮助您了解对象的属性和方法

    Get-member 有许多可以提供帮助的参数。

    【讨论】:

    • 谢谢..我来自 C++ 背景,在调用以,分隔的参数的函数之前没有三思而后行
    【解决方案2】:

    通常在右侧进行类型转换:

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

    这可能是你的问题吗?


    第二次观察:

    正如@JPBlanc 所观察到的,您将一个数组传递给您的函数,而不是三个参数。使用:

    添加 1 2 3

    你会得到它。无论如何,在这种情况下你不需要强制转换。可能在这个:

    添加“1”“2”“3”

    显然你可以像Add 1,2,3一样继续调用你的函数,但是你需要改变它如下:

    函数添加 { 参数[0] | % {$sum=0}{$sum+=$_}{write-output "Sum is $sum"} }

    【讨论】:

    • 再看一点 Empo @Naveen 犯了一个 newby 错误,他试图用数组作为参数调用,尽管传递了参数。
    • 当您调用带参数的对象方法时,您仍然需要“,”。这确实是 powershell newby 或来自任何语言的陷阱。
    • 是的,这是真的。你用arguments(如果有的话)调用对象methods,使用逗号的常用方式,就像你在C#中所做的那样。您使用 parameters 不带逗号调用 cmdlet
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多