2014-04-16 9 views
0

나는 객체의 배열, 컴퓨터 목록을, 그래서 배열은 다음과 같이 보입니다 :요소 ID

나는이과 오프라인이 어떤을 반복 할 필요가
+----------+-----------+---------------+ 
| size(MB) | Computer | Location | 
+----------+-----------+---------------+ 
| 100  | compname1 | C:\Users\etc\ | 
| Offline | compname2 | Offline  | 
| 30  | compname3 | C:\users\etc2 | 
+----------+-----------+---------------+ 

, 스캔 다시. 내가 가진 문제는 루프의 각 반복에서 배열의 현재 객체의 요소 번호를 찾는 방법입니다.

내가했다 : 값을 반환했지만 정확하지 않는 것
$element = [array]::IndexOf($complist.computer,$compname) 

는 (반환 된 요소가 올바른 배열 요소와 일치하지 않습니다).

마지막 게임은 '오프라인'으로 표시된 컴퓨터의 배열을 실행하고 해당 컴퓨터에서 검색을 실행 한 다음 배열의 요소를 새 데이터로 바꿔야한다는 것입니다.

+0

스크립트에서 논리를 변경하고 $ i ++로 모든 요소를 ​​증가시키고 그 번호를 요소 ID로 사용하는 것으로 끝났습니다. 그래도 질문에 대한 답변을 얻는 것이 좋을 것입니다. – mhouston100

+0

PowerShell에서 다르게 다룰 것입니다. 당신이 정말로하고 싶은 것은 '온라인'컴퓨터를 목록에 유지하고 목록에있는 '오프라인'컴퓨터의 데이터를 대체하는 것입니다. 기존 배열을 변경하는 대신 다음과 비슷한 일을 할 수 있습니다 :'$ data | Foreach {if ($ _. 위치 -eq "오프라인") {Write-Output (Get-ComputerDetails -ComputerName $ _. 컴퓨터)} else {Write-Output $ _}} ' –

+0

문제는 1 : 1 교체. 예를 들어, PC가 오프라인이면 하나의 레코드가 있습니다. 그러나 그것이 스캔되면 여러 사용자가있을 수 있으므로 CSV에 1, 2, 3 .... 레코드가있을 수 있습니다. 그것이 CSV가되어야하는 이유는 내가 그것을 보낼 때 사람이 읽을 수 있어야한다는 것입니다. – mhouston100

답변

0

을 테스트하지 :

$newarray = 
foreach ($item in $array) 
{ 
    if (
     ($item.location -eq 'offline') -and 
     (Test-Connection $Item.computer -Quiet) 
     ) 

     { 
     Write-Verbose "Found $($item.Computer) online. Updating." 
     foreach ($userdir in (Get-ChildItem "\\$($item.Computer)\C$\users" -Directory)) 
      { 
      $DirSize = (Get-ChildItem $userdir -Recurse | measure -Sum length).sum 
      [PSCustomobject]@{ 
           Size = $DirSize 
           Computer = $item.Computer 
           Location = 'C:\users\' + $userdir.Name 
          } 
      } 
     } 
     Else { $item } 
    }  

가 1 아니라 이후 - 새 배열을 생성해야 할거야 1 교체, 당신은 단지 대체 할 수 없습니다. 이 명령은 원래 배열을 읽고 오프라인 상태이지만 현재 온라인 상태 인 컴퓨터에 대한 새 항목을 만듭니다. 다른 모든 것은 그냥 통과합니다.