2017-02-17 62 views
1

我想要替换我的表中的变量,但我似乎无法做到这一点。在一个成功的ping,我想Success下的值更改为1,但无论我做什么,它一直是一个0 $ping目前返回是这样的:无法更改成功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) 
     } 
     } 
+0

您应该责怪“成员枚举”(PowerShell v3 +功能),它可以让您编写'$ ping.Hostname'或'$ ping.Success'。 – PetSerAl

回答

0

您正在以独特的方式迭代你的对象。此外,你不是索引你的数组正确的元素。我没有技术解释还没有,但是当你指数的成功像这样

$ping.Success[$i] 

那请问回报正确的行正确的值。但是,您无法直接访问设置该行上的值。在这种情况下,您的默认值为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 
+0

谢谢!这很好。林新一般的PowerShell和编码,所以我的做事方式是......不同。我感谢您的帮助! – NovaPrice