Powershell在for()语句中给出了op_Addition错误

时间:2013-01-15 23:10:11

标签: powershell

我们的PowerShell脚本发出错误:

  

方法调用失败,因为[System.Object []]不包含名为op_Addition'的方法

我正在编写一个“四排”游戏,因此必须检查游戏是否包含四行。

这是我的一段代码,用于检查获胜者:

[script]
function winner{

        $spelbordd = @()
        $spelbordd += ,@($A10,$B10,$C10,$D10,$E10,$F10,$G10,$H10,$I10,$J10)  
        $spelbordd += ,@($A9,$B9,$C9,$D9,$E9,$F9,$G9,$H9,$I9,$J9) 
        $spelbordd += ,@($A8,$B8,$C8,$D8,$E8,$F8,$G8,$H8,$I8,$J8) 
        $spelbordd += ,@($A7,$B7,$C7,$D7,$E7,$F7,$G7,$H7,$I7,$J7) 
        $spelbordd += ,@($A6,$B6,$C6,$D6,$E6,$F6,$G6,$H6,$I6,$J6) 
        $spelbordd += ,@($A5,$B5,$C5,$D5,$E5,$F5,$G5,$H5,$I5,$J5) 
        $spelbordd += ,@($A4,$B4,$C4,$D4,$E4,$F4,$G4,$H4,$I4,$J4) 
        $spelbordd += ,@($A3,$B3,$C3,$D3,$E3,$F3,$G3,$H3,$I3,$J3) 
        $spelbordd += ,@($A2,$B2,$C2,$D2,$E2,$F2,$G2,$H2,$I2,$J2) 
        $spelbordd += ,@($A1,$B1,$C1,$D1,$E1,$F1,$G1,$H1,$I1,$J1)

        for([int]$i=0; $i -lt 9; $i++){
    if($i -le 5){
        for([int]$r=0; $r -lt 9; $r++){
            if($spelbordd[$i, $r] -and $spelbordd[$i+1, $r] -and $spelbordd[$i+2,$r] -and $spelbordd[$i+3]){
                $winner = $player
             }
         }
    }
    for([int]$r=0; $r -le 5; $r++){
        for([int]$j=0; $j -lt 9; $j++){
            if($spelbordd[$r,$j] -and $spelbordd[$r+1,$j] -and $spelbordd[$r+2,$j] -and $spelbordd[$r+3,$k]){
                $winner = $player
             }
         }
     }
}

$winner

有什么问题?我花了几个小时在Google上搜索,但我找不到具体的答案。

2 个答案:

答案 0 :(得分:0)

我认为你误解了如何访问二维数组的元素。当你说:

$spelbordd[$i, $r]

你要说的是,给我$ i和$ r的元素,返回2个数组(第二维)。要访问行$ i和列$ r的元素,请使用:

$spelbordd[$i][$r]

答案 1 :(得分:-1)

虽然最初的答案“解决了”OP问题,但他们没有回答这个问题。没有解释错误消息为何

的原因

方法调用失败,因为[System.Object []]不包含名为op_Addition

的方法

答案在于Powershell(https://msdn.microsoft.com/en-us/powershell/reference/5.0/microsoft.powershell.core/about/about_operator_precedence)中稍微模糊的运算符优先级。特别是,','(数组元素分隔符)的优先级高于'+'(加法)。因此,虽然可以假设数组访问表达式

$ spelbordd [$ i + 1,$ r]

返回两个数组的数组$ spelbordd [$ i + 1]和$ spelbordd [$ r](切片的串联),实际上数组元素表达式[$ i + 1,$ r]解析为[ $ i +(1,$ r)]因此尝试使用其op_Addition方法将$ i添加到数组[System.Object []](1,$ r)(当您使用'+'运算符时会发生什么非ValueType对象)。由于[System.Object []]没有op_Addition方法,因此列出了错误结果。

P.S。在这种情况下,意外的优先级问题仅由于语法错误(访问二维数组的方法不正确)而暴露。但是,微妙的运算符优先级可以表现为更常见的表达式。除了那些创建具有本身表达式元素的数组的表达式之外,最可能的陷阱是格式运算符'-f',其优先级在','和算术运算符之间。因此,以下示例产生了一些意想不到的结果:

'{0} {1}' - f 1 + 2,2
错误,格式化参数不足
因为它解析为
('{0} {1}'-f 1)+(2,2)
在尝试将“+”应用于(2,2)之前格式失败。

'{0} {1}'-f 1,2 + 2
1 22
因为它解析为
('{0} {1}'-f(1,2))+ 2
并且('{0} {1}' - f(1,2))的结果是[System.String],虽然它也没有op_Addition,但是在'+'运算符中有明确定义的行为Powershell(https://msdn.microsoft.com/en-us/powershell/reference/3.0/microsoft.powershell.core/about/about_arithmetic_operators)。

'{0} {0}'-f 1 + 2,2#使用第一个格式参数两次
1 12 2
因为它解析为
('{0} {0}'-f 1)+(2,2)
并且,由于左操作数的类型决定了如何应用运算符,因此结果为
('{0} {0}'-f 1)+ [System.String](2,2)#[System.String] $ somearray is($ somearray -join'')

说到-join,优先顺序

一元-join

二进制-join

所以

-join 1,2是(-join 1),2 =('1',2)#([String],[Int32])
-join(1,2)='12'
1,2-join''是(1,2)-join''='12'

BTW,为了在技术上精确,OP使用的是数组数组,而不是二维数组,这就是元素访问语法错误的原因。如果OP实际上创建了一个二维数组(如$ spelbordd = new-object'Boule [,]'10,10)那么元素访问语法就是正确的。