none
Как создать клон объекта? RRS feed

  • Вопрос

  • Делаю вот что :
    Есть некий файл hosts.lst с содержимым

    192.168.1.1      Центральный маршрутизатор
    10.1.1.1           Удаленный маршрутизатор

    Читаю и разбираю этот файл командой:
    $ListHosts =  get-content -en utf8 .\echo\hosts.lst |select-object @{e={$_.split("`t")[0]};n='IP'},@{e={$_.split("`t")[1]};n='Description'},@{e={$null};n='Status'}

    Далее делаю ping хостов и заполняю поле Status и так в цикле

    Но по алгоритму программа должны знать предыдущее состояние хостов для того чтобы определить были ли изменения и я следуя логике пишу:
    $PrevStatusHosts = $ListHosts и отправляю на следующую итерацию цикла опроса

    Но как только переменная $ListHosts изменяется, изменяется и $PrevStatusHosts. Т.е. при исполнении команды $PrevStatusHosts = $ListHosts не создается новый экземпляр объекта, а создается просто ссылка на объект $ListHosts.
    Команда $PrevStatusHosts = $ListHosts.Clone() не изменяет ситуацию, хотя с массивами работает.

    Как создать "слепок" объекта, который не менялся бы при изменении дочернего объекта?

Ответы

  • Вполне красивое решение, Select-Object как раз создаёт новую копию объекта. Только вы его некрасиво записали :)
    Можно так:
    $PrevStatusHosts =  $ListHosts |select-object IP,Description,Status
    или даже так:
    $PrevStatusHosts =  $ListHosts |select-object *

    Кстати, а вы случайно не это хотите написать? ;) http://xaegr.wordpress.com/2008/10/23/monitor-host/


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа ToIIIa 2 июня 2009 г. 6:55
    Модератор

Все ответы

  • $PrevStatusHosts = $ListHosts | Foreach-Object { $_.Clone() }
    Сазонов Илья http://www.itcommunity.ru/blogs/sie/
    Модератор
  • Method invocation failed because [System.Management.Automation.PSCustomObject] doesn't contain a method named 'Clone'.
    At line:1 char:58
  • $PrevStatusHosts = $ListHosts | Foreach-Object { $_.ToString().Clone() }
    Сазонов Илья http://www.itcommunity.ru/blogs/sie/
    Модератор
  • $PrevStatusHosts стал тип string и равен 3-и пустых строки, вероятно потому что $ListHosts содержал три строки.
    В общем тоже не сработало! Есть еще варианты?

  • Решение нашел - может быть не очень красивое, но работает.

    $PrevStatusHosts =  $ListHosts |select-object @{e={$_.IP};n='IP'},@{e={$_.Description};n='Description'},@{e={$_.Status};n='Status'}
    • Помечено в качестве ответа ToIIIa 2 июня 2009 г. 6:55
    • Снята пометка об ответе ToIIIa 2 июня 2009 г. 6:55
  • Вполне красивое решение, Select-Object как раз создаёт новую копию объекта. Только вы его некрасиво записали :)
    Можно так:
    $PrevStatusHosts =  $ListHosts |select-object IP,Description,Status
    или даже так:
    $PrevStatusHosts =  $ListHosts |select-object *

    Кстати, а вы случайно не это хотите написать? ;) http://xaegr.wordpress.com/2008/10/23/monitor-host/


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа ToIIIa 2 июня 2009 г. 6:55
    Модератор
  • Спасибо. Работает.
    Действительно, нечто подобное хочу написать. Готовое брать не хочу потому как набираюсь практического опыта с Powershell. Мало того есть готовая, проверенная версия скрипта на vbs, работающая уже 5 лет.