Лучший отвечающий
Как создать клон объекта?

Вопрос
-
Делаю вот что :
Есть некий файл 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() не изменяет ситуацию, хотя с массивами работает.
Как создать "слепок" объекта, который не менялся бы при изменении дочернего объекта?27 мая 2009 г. 5:15
Ответы
-
Вполне красивое решение, 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
2 июня 2009 г. 6:11Модератор
Все ответы
-
$PrevStatusHosts = $ListHosts | Foreach-Object { $_.Clone() }
Сазонов Илья http://www.itcommunity.ru/blogs/sie/27 мая 2009 г. 8:37Модератор -
Method invocation failed because [System.Management.Automation.PSCustomObject] doesn't contain a method named 'Clone'.
At line:1 char:5827 мая 2009 г. 8:41 -
$PrevStatusHosts = $ListHosts | Foreach-Object { $_.ToString().Clone() }
Сазонов Илья http://www.itcommunity.ru/blogs/sie/27 мая 2009 г. 11:01Модератор -
$PrevStatusHosts стал тип string и равен 3-и пустых строки, вероятно потому что $ListHosts содержал три строки.
В общем тоже не сработало! Есть еще варианты?28 мая 2009 г. 2:19 -
Решение нашел - может быть не очень красивое, но работает.
$PrevStatusHosts = $ListHosts |select-object @{e={$_.IP};n='IP'},@{e={$_.Description};n='Description'},@{e={$_.Status};n='Status'}2 июня 2009 г. 4:35 -
Вполне красивое решение, 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
2 июня 2009 г. 6:11Модератор -
Спасибо. Работает.
Действительно, нечто подобное хочу написать. Готовое брать не хочу потому как набираюсь практического опыта с Powershell. Мало того есть готовая, проверенная версия скрипта на vbs, работающая уже 5 лет.2 июня 2009 г. 6:55