成功ping时无法更改对象值

时间:2017-02-17 22:40:07

标签: powershell replace

我正在尝试替换表中的变量,但我似乎无法做到。在成功执行ping操作时,我希望将Success下的值更改为1,但无论我做什么,它都会保持为0. $ping当前返回的内容如下:

+-------------------+----------+
|     Hostname      |  Success |
+-------------------+----------+
| BVL-W71455781745  |        0 |
| BVL-WX966103545   |        0 |
| BVL-W7583554017   |        0 |
+-------------------+----------+
$ping = Import-csv C:\temp\pingtst.csv -Header 'Hostname' | Select-object *,@{Name='Success';Expression={'0'}}
$i = 0
foreach ($HostName in $ping.Hostname) {

if (Test-Connection -ComputerName $HostName -count 3 -Quiet)
    {
        $ping.Success[$i] = '1'
        $i = ($i + 1)
        } else

        {$ping.Success[$i] = '0'
        $i = ($i + 1)
        }
        }

1 个答案:

答案 0 :(得分:0)

你正在以一种奇特的方式迭代你的物体。您也没有在正确的元素上索引数组。我还没有技术解释,但当你像成功那样索引成功时

$ping.Success[$i]

返回正确行的正确值。但是,您无法直接访问该行上的 set 值。在这种情况下,您的默认值为0。

如果你做了这样的事情,你会得到你期望的结果。

$ping[$i].Success

不需要整个$i,因为有更好的方法来处理对象数组。

$results = Import-csv C:\temp\pingtst.csv -Header 'Hostname' | 
    Select-object hostname,@{Name='Success';Expression={'0'}} | 
    ForEach-Object{
        # Test the connection. Since the value is already 0 only change on success
        if (Test-Connection -ComputerName $_.Hostname -count 3 -Quiet){
            $_.Success = 1
        }
        # Send this row down the pipeline
        $_


}

# This should look like you expect now.
$results