Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Механизм замены части данных в Powershell

Ответить
Настройки темы
PowerShell - Механизм замены части данных в Powershell

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465


Конфигурация

Профиль | Отправить PM | Цитировать


Уважаемые товарищи, объясните мне, пожалуйста, одну вещь.

Вот есть какие-то данные, к примеру, список процессов, я их помещаю в переменную:
Код: Выделить весь код
$src = get-process |select name,product,ProductVersion |? product -match "операционная система"
Результат:
Name           Product                                  ProductVersion
----           -------                                  --------------
explorer       Операционная система Microsoft® Windows® 10.0.17763.769
smartscreen    Операционная система Microsoft® Windows® 10.0.17763.769
svchost        Операционная система Microsoft® Windows® 10.0.17763.769
svchost        Операционная система Microsoft® Windows® 10.0.17763.769
svchost        Операционная система Microsoft® Windows® 10.0.17763.769
svchost        Операционная система Microsoft® Windows® 10.0.17763.769
SystemSettings Операционная система Microsoft® Windows® 10.0.17763.769
taskhostw      Операционная система Microsoft® Windows® 10.0.17763.769
Дальше я беру и создаю переменную из куска предыдущих данных:
Код: Выделить весь код
$piece = $src |? name -match smart
Результат:
Name        Product                                  ProductVersion
----        -------                                  --------------
smartscreen Операционная система Microsoft® Windows® 10.0.17763.769
Теперь я беру и меняю имя в этом куске:
Код: Выделить весь код
$piece.name = "Умный экран"
Результат:
Name        Product                                  ProductVersion
----        -------                                  --------------
Умный экран Операционная система Microsoft® Windows® 10.0.17763.769
Теперь самое удивительное - если вывести содержимое первой переменной, где содержатся все данные, то имя из того куска, который вычленили, тоже будет изменено:
Код: Выделить весь код
$src
Результат:
Name           Product                                  ProductVersion
----           -------                                  --------------
explorer       Операционная система Microsoft® Windows® 10.0.17763.769
Умный экран    Операционная система Microsoft® Windows® 10.0.17763.769
svchost        Операционная система Microsoft® Windows® 10.0.17763.769
svchost        Операционная система Microsoft® Windows® 10.0.17763.769
svchost        Операционная система Microsoft® Windows® 10.0.17763.769
svchost        Операционная система Microsoft® Windows® 10.0.17763.769
SystemSettings Операционная система Microsoft® Windows® 10.0.17763.769
taskhostw      Операционная система Microsoft® Windows® 10.0.17763.769
Это очень удобно - можно, к примеру, менять загруженный в память CSV построчно по определённой выборке, но я не понимаю, почему, изменяя один объект, по идее, являющийся отдельным, меняется другой.

Кто-нибудь знаком с этим механизмом?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 21:49, 20-09-2019

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
не понимаю, почему, изменяя один объект, по идее, являющийся отдельным, меняется другой. »
В powershell, массивы создаваемые оператором присваивания, работают по ссылке на один и тот же объект.
Изменение размера массива, фактически создает новый массив и в этом случае, они уже не будут взаимосвязанными.
Для иллюстрации:
Код: Выделить весь код
$a=,1
$b=$a
$b[0]=3
$a
$b+=1
$b[0]=10
$a

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:49, 20-09-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


DJ Mogarych, как верно сказал коллега YuS_2, это поведение зависит от того, что происходит в конкретном языке при реализации операции присваивания объектных переменных в том или ином случае. В приведённом Вами случае, надо полагать, что некоей переменной X, стоящей слева от оператора присваивания, присваивается ссылка на ту же самую коллекцию объектов (в памяти), на которую ссылается некая переменная Y, которая находится справа от оператора присваивания. Где-то этим поведением можно управлять явно, где-то — неявно, а где-то — управлять вовсе нельзя (как было задано создателями языка, так, мол, и пользуйте).
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:30, 20-09-2019 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Получается, что без изменения размеров область памяти одна, и переменные работают как фильтр, а если изменить размер, системе приходится создавать новый объект?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 07:45, 21-09-2019 | #4


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
Изменение размера массива, фактически создает новый массив »
в PowerShell массивы фиксированного размера, поэтому никакого изменения размера массива попросту нет. Операция массив + что-то возвращает новый массив.

Цитата DJ Mogarych:
если изменить размер, системе приходится создавать новый объект »
система никаких решений не принимает, набор операция для каждого типа определён заранее

К сожалению, что и как реализовано можно только выучить.

Отправлено: 10:42, 21-09-2019 | #5


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Busla:
Операция массив + что-то возвращает новый массив. »
Уважаемый, вы если решили поумничать на пустом месте, то вчитайтесь в то, что написано выше, а именно в то, что вы процитировали...
Что вы хотели сказать - непонятно, ибо написали то же самое, что написано в цитате, просто другими словами... нет?

-------
scio me nihil scire. Ѫ


Отправлено: 12:28, 21-09-2019 | #6


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
написали то же самое, что написано в цитате, просто другими словами... нет? »
нет
я описал реализацию, а вы - магию
очень показательно, как ваше "то же самое" воспринял топикстартер:
Цитата DJ Mogarych:
Получается, что без изменения размеров область памяти одна, и переменные работают как фильтр, а если изменить размер, системе приходится создавать новый объект? »
размер тут не при чём
для списков определена операция добавления:
Код: Выделить весь код
> $a = New-Object 'System.Collections.Generic.List[int]'
> $a.Add(4)
> $b=$a
> $a.Add(4)
> $b
4
4
и изменение размера ни к каким пересозданиям не приводит

Отправлено: 13:42, 21-09-2019 | #7


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Цитата Busla:
Операция массив + что-то возвращает новый массив. »
Тогда как объяснить ситуацию, описанную мной в самом начале?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 14:54, 21-09-2019 | #8


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Busla:
я описал реализацию »
Да что вы говорите?! Отлично!
Самомнение у вас раздуто сильно.
Если уж беретесь кулаком в грудь стучать, то описывайте не косноязычно:
Цитата Busla:
Операция массив + что-то возвращает новый массив. »
Такое описание даже на сказку не тянет, не то что на магию, если что...
Что это за операция такая "Плюс что-то"?

Цитата Busla:
для списков определена операция добавления: »
При чем тут списки вообще? Вы только себя читаете, а вопросы по диагонали?
Там самый обычный массив:
Цитата DJ Mogarych:
$src = get-process |select name,product,ProductVersion »
Код: Выделить весь код
PS_5.1> $src = get-process |select name,product,ProductVersion
PS_5.1> $src.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
Попробуйте проделать то же самое с объектом System.Array, т.е.:
Код: Выделить весь код
$a = ,1
$a.add(4)
- что получите в результате?

А потом проверьте:
Код: Выделить весь код
$a.length
$a+=8
$a.length
- для конечного пользователя, это суть "изменение" размера массива, хоть и внутри это работает по-другому, о чем и было сказано.
Вы же полезли на какой-то рожон и решили поумничать.
Бог вам судья, пишите ещё...

-------
scio me nihil scire. Ѫ


Отправлено: 15:13, 21-09-2019 | #9


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
При чем тут списки вообще? Вы только себя читаете, а вопросы по диагонали? »
как раз наоборот: вы что-то сказали, а не можете принять, что ваши слова кто-то интерпретирует иначе
и самомнение раздуто у вас
помимо вас тут есть ещё люди, и они тоже что-то пишут

списки это пример того, что вывод из ваших слов получился неверный:
Цитата DJ Mogarych:
переменные работают как фильтр, а если изменить размер, системе приходится создавать новый объект »
Цитата DJ Mogarych:
как объяснить ситуацию, описанную мной в самом начале? »
Нагляднее всего это проявляется в языках более низкого уровня с прямым управлением памятью: Си, Паскаль - там типы значений и ссылочные типы (указатели) имеют разный синтаксис.

Цитата DJ Mogarych:
список процессов, я их помещаю в переменную »
на самом деле это список ссылок на объекты процессов, а в переменной не список, а ссылка на него
Операции над списком ссылок сами объекты процессов не затрагивают, точно так же как и изменение отдельного свойства объекта не копирует и не замещает весь объект. Ссылка на него остаётся той же.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:25, 21-09-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Механизм замены части данных в Powershell

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - Вывод данных в cmd из PowerShell без запуска консоли Nolly Скриптовые языки администрирования Windows 3 03-05-2018 20:24
VBS/WSH/JS - [решено] Поиск строки по части названия и вывод данных в ECHO Kainos Скриптовые языки администрирования Windows 14 16-04-2015 22:21
PowerShell - PowerShell: импорт данных в AD из файла Perersmeshnik Скриптовые языки администрирования Windows 2 20-02-2014 09:44
PowerShell - [решено] Powershell Изменение данных пользователя во всех OU morrozilla Скриптовые языки администрирования Windows 2 16-04-2013 15:26
PowerShell - [решено] Изменение строки таблицы в базе данных MySQL при помощи Windows PowerShell Dezmond Скриптовые языки администрирования Windows 5 28-09-2012 15:03




 
Переход