Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823

Передать объект из одной функции в другую

20.05.2021, 20:43. Показов 4517. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вывести из функции переменную или свойство объекта вроде и несложно, например делал так:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
Function My {
  'A'..'C'|% {
    $oPr = [PSCustomObject]@{
      Name  = 'Name'
      Value = 'Value : '+$_
    }
    $oPr.Value
  }
}
$z = My
$z|% {$_}
А вот понадобилось весь объект (все его свойства) передать в другую функцию. Ну, не просто, естественно передать, а как-то изменить или что-то добавить - понятно. Вроде и сделал, но терзают смутные сомнения, а правильно ли, а надежно ли, а может у изобретенного велосипеда давно есть мудрый дед ...
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Function A($w) {
  $w|% {
    $oPrA = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrA|% {$_}
  }
}
$a = A ('A'..'C')
'Function A'
$a
'---'
Function B($d) {
  $d|% {
    $oPrB = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrB|% {$_}
  }
}
$b = B (1..3)
'Function B'
$b
'---'
$cName  = $a.Value|% {($_ -Split ':\s')[1]}
$cValue = $b.Name|%  {$_[-1]}
Function C {
  for ($i=0; $i -lt $cValue.count; $i++) {
    $oPrC = [PSCustomObject]@{
      Name  = "Name$($cName[$i])$($cValue[$i])"
      Value = 'Value : '+$cName[$i]+$cValue[$i]
    }
    $oPrC
  }
}
'Function C'
C
'---'
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.05.2021, 20:43
Ответы с готовыми решениями:

Передать переменную из одной функции в другую, в первой она число, во второй приходит как объект.
Evgen1337, Подскажите еще пожалуйста, мне надо передать переменную из одной функции в другую, в первой она число, во второй приходит как...

Как передать объект Connect из одной формы в другую
Создаю соединение в одной форме, затем в другой выполняю запрос. Как передать во вторую форму connect? 1 форма: ...

Как передать объект (в памяти) из одной формы в другую... разъяснения
Пусть у меня открыто два документы - сначала открывается первый, потом второй. При открытии первого в память забивается объект...

20
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
20.05.2021, 21:18
Постановка вопроса сбивает с толку. Если "вывести" некоторую переменную из функции, проще использовать модификатор script, при этом если не подразумевается "сцепления" значений посредством конвейера, лучше тело функции поместить в блок "end". Например:

PowerShell
1
2
3
4
5
6
7
8
function A([String]$arg) {
  end {
    $script:foo = -join([Byte[]][Char[]]$arg).ForEach{[Char[]]($_ - 32)}
  }
}
 
A('string')
$foo
1
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
20.05.2021, 22:06
Вызови одну функцию из другой:

PowerShell
1
2
3
4
5
6
7
function a { Get-Childitem; b }
function b { Get-Date }
 
$a = a
 
$a.Year
$a.Name
1
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
21.05.2021, 07:25
PowerShell
1
2
3
4
5
6
7
. { $args[0] }(. {
        [PSCustomObject]@{
            Name  = "[Name]"
            Value = "[value]"
        }
    }
)
Добавлено через 4 минуты
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
$fn1 = {
    [PSCustomObject]@{
        Name  = "[Name]"
        Value = "[value]"
    }
}
 
$fn2 = {
    Write-Output $args[0]
}
 
 
$fn2.Invoke($fn1.Invoke())
Добавлено через 1 минуту
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
function fn1 {
    [PSCustomObject]@{
        Name  = "[Name]"
        Value = "[value]"
    }
}
 
function fn2 {
    Write-Output $args[0]
}
 
fn2 (fn1)
1
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
21.05.2021, 15:30  [ТС]
ну что
---
Цитата Сообщение от greg zakharov Посмотреть сообщение
тело функции поместить в блок "end"
а если цикл? Да и неполноценно как-то
---
Цитата Сообщение от lesser Посмотреть сообщение
одну функцию из другой:
в принципе работает
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function A($w) {
  $w|% {
    $oPrA = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrA
  }
  B (1..3)
}
'---'
Function B($d) {
  $d|% {
    $oPrB = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrB
  }
}
'---'
$a = A ('A'..'C')
$a
---
alhaos,
тоже работает
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Function A($w) {
  $w|% {
    $oPrA = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrA
  }
}
'---'
Function B($d) {
  $d|% {
    $oPrB = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrB
  }
  Write-Output $Args[0]
}
'---'
B (1..3) (A ('A'..'C'))
Добавлено через 14 минут
пожалуй как-то логичнее и удобнее последний код alhaos
почему?
в сравнении с кодом lesser, который тоже прекрасно работает мне проще заранее в код поместить строку
Write-Output $Args[0]
которая ни к чему меня не привязывает и загонять детали в конце: B (1..3) (A ('A'..'C'))
против строки, которую заранее надо поместить в код
B (1..3)
где уже и имя функции за которым надо проследить и необходимые параметры не забыть
ну это все конечно сугубо мое мнение, может кому-то покажется наоборот.
Спасибо всем за помощь!
0
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,663
Записей в блоге: 65
21.05.2021, 15:58
alpap, функция в Powershell это просто именованный скриптблок, к этому просто надо привыкнуть.
0
 Аватар для bidstrup
419 / 179 / 27
Регистрация: 11.03.2018
Сообщений: 771
21.05.2021, 16:14
Цитата Сообщение от greg zakharov Посмотреть сообщение
Постановка вопроса сбивает с толку
Тут всё сбивает с толку.

ТС обладает редким даром - взять простую вещь и, опутав её своими объяснениями, превратить её в нечто невообразимое.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
21.05.2021, 16:56  [ТС]
запросов в интернете даже по поводу как вывести переменную из функции немало, значит не все уж так и просто, а мне вот все свойства объекта понадобились, т.е. сам объект.
Цитата Сообщение от bidstrup Посмотреть сообщение
взять простую вещь и, опутав её своими объяснениями
а я привык именно относительно простой вещи проработать разнообразные с ней варианты чтобы не сооружать код заново с нуля, а заглянув в какие-то наработки, взять основу и уже просто дополнить моментами запроса.
0
 Аватар для bidstrup
419 / 179 / 27
Регистрация: 11.03.2018
Сообщений: 771
21.05.2021, 17:24
Цитата Сообщение от alpap Посмотреть сообщение
а мне вот все свойства объекта понадобились,
Выводом свойств и методов объекта грешит cmdlet Get-Member

https://docs.microsoft.com/en-... rshell-5.1
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
21.05.2021, 23:12
Никак не могу понять, что именно требуется))
Цитата Сообщение от alpap Посмотреть сообщение
в принципе работает
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function A($w) {
  $w|% {
    $oPrA = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrA
  }
  B (1..3)
}
'---'
Function B($d) {
  $d|% {
    $oPrB = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrB
  }
}
'---'
$a = A ('A'..'C')
$a
Приведенная функция создает вот такой объект:
Name Value
---- -----
NameA Value : A
NameB Value : B
NameC Value : C
Name1 Value : 1
Name2 Value : 2
Name3 Value : 3

Создать его можно так:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
cls
Function foo($w) {
    $w|% {
        [PSCustomObject]@{
            Name  = "Name$_"
            Value = 'Value : '+$_
        }
    }
}
$a = foo ('A'..'C')
$a+= foo (1..3)
 
$a
Или еще лучше:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
cls
$foo = {
    [PSCustomObject]@{
        Name  = "Name$_"
        Value = 'Value : '+$_
    }
}
 
$a = 'A'..'C'|% $foo
$a+=   1..3  |% $foo
 
$a
1
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
22.05.2021, 04:21  [ТС]
Цитата Сообщение от bidstrup Посмотреть сообщение
Выводом свойств и методов объекта грешит cmdlet Get-Member
а то я не знаю, но только не сильно в этом случае он поможет мне перетащить за функцию свойства созданного в функции объекта:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Function A($w) {
  $w|% {
    $oPrA = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    foreach ($i in $oPrA) {$i}
  }
}
$a = A ('A'..'C')
$a
'---'
Function A1($w1) {
  $w1|% {
    $oPrA1 = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrA1|gm
  }
}
$a1 = A1 ('A'..'C')
$a1.Definition
Добавлено через 6 минут
Цитата Сообщение от Fors1k Посмотреть сообщение
что именно требуется
по сути - владеть объектом (хотя бы всеми свойствами, этого достаточно) созданным в функции за ее пределами
выше в п11 стр7 вполне себе это выполняет, просто думал может чего не знаю уже приспособленного для этой цели. Но, то ли таких задач ни у кого не попадалось или все стараются избежать такой ситуации и не допускать ее.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
22.05.2021, 08:50
Цитата Сообщение от alpap Посмотреть сообщение
Но, то ли таких задач ни у кого не попадалось или все стараются избежать такой ситуации и не допускать ее.
Тебе просто мешает наследие cmd... отбрось все его установки и чаще к документации обращайся.
В powershell работают области действий и функция от скрипта отличается тем, что в ней существует своя, локальная область действий и приватные переменные. Но внутри функций можно создавать переменные в родительских областях, явно указав их область действий. Соответственно, всё, что захочется можно передавать и в другие области/функции, посредством родительской области. Вопрос только в том, как именно это сделать в каждом конкретном случае, ведь функции, как правило (хоть и не всегда), возвращают какое-либо значение, а раз так, то из любой функции, можно вызвать другую доступную функцию. Т.е. для того, чтобы понять, какой требуется код в конкретном случае, необходимо сначала определиться с постановкой задачи.
Кроме того, обычно не рекомендуют создавать монструозные функции с передачей различных данных вовне, а также с воздействующими внешними данными извне на выполнение функций, лучше создавать несколько простых функций с передачей им параметров и вызывать их, да хоть друг из друга...
Можно, конечно, делать так:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function a {
    $global:var = [pscustomobject]@{
        Name  = 'My'
        Value = 'Val'
    }
}
 
function b {
    $tmp = $var
    return $tmp
}
 
b
a
b
- синтаксис позволит. Обрати внимание на последовательность вызова функций и возвращаемые ими данные...
Но так точно делать не следует, ибо чревато, в более сложном коде, получением неожиданных результатов...
т.е. то же самое, но более вменяемо, лучше сделать так:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function a {
    $a = [pscustomobject]@{
        Name  = 'My'
        Value = 'Val'
    }
    return $a
}
 
function b {
    $tmp = a
    return $tmp
}
 
b
a
b
- (return - здесь для наглядности) если в функции b требуются данные из функции a, то мы её просто вызываем непосредственно в коде самой функции b и кроме того, можем вызывать функцию а в любой другой области. Т.о. мы получаем более управляемый и последовательный код, безо всяких неожиданностей, в виде переменных из родительских областей, содержащих различные значения в разные моменты исполнения кода.
Про области
2
 Аватар для bidstrup
419 / 179 / 27
Регистрация: 11.03.2018
Сообщений: 771
22.05.2021, 11:29
Цитата Сообщение от alpap Посмотреть сообщение
а то я не знаю, но только не сильно в этом случае он поможет мне перетащить за функцию свойства созданного в функции объекта
Если функция у тебя создаёт объекты типа 'крокодил' ( Крокодилья ферма ), то возврат из неё вместо крокодила только крокодильих зубов никак не поможет в решении задачи схватить и уволочь аборигена на дно. Здесь нужно вернуть крокодила
целиком со всеми его свойствами и навыками.



Сама задача не описана. Вот уже шесть человек не могут понять, что надо-то ?


Строго говоря, никакие функции создавать не надо; само понятие объект и его создание в нужный момент - это и есть инкапсуляция данных и производимых над ними действий ( если у объекта есть методы )
1
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
22.05.2021, 13:35  [ТС]
сделал наконец вот так. Так нет вмешательства в функцию, все действия над выводом извне производятся
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Function A($w) {
  $w|% {
    $oPrA = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $oPrA
  }
}
 
$ScriptA = {
  A ('A'..'C')
}
$oPrADbl = $ScriptA.InvokeReturnAsIs()
$oPrADbl
Добавлено через 7 минут
Цитата Сообщение от bidstrup Посмотреть сообщение
Сама задача не описана
потому что это уже пролог с шаблоном на перспективу
сыр-бор возник когда я еще делал эту задачу. Сначала была одна задумка, которая была воплощена с помощью функции. Потом захотелось расширенного варианта и как раз надо было передать из этой функции пару свойств объекта в другую функцию что реализовано не было на том этапе по причине которой и создана тема, а выполнено без применения функций вообще - а хотелось и мысль жила в голове. Вот воплощаю.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
22.05.2021, 13:43
Цитата Сообщение от alpap Посмотреть сообщение
Так нет вмешательства в функцию
Можно и так. Правда здесь два лишних действия. Нет смысла создавать доп.переменную в функции и создавать скриптблок, записывая его в переменную...
Результат будет аналогичным:
PowerShell
1
2
3
4
5
6
7
8
9
10
Function A($w) {
    $w|% {
        [PSCustomObject]@{
            Name  = "Name$_"
            Value = 'Value : '+$_
        }
    }
}
$oPrADbl = A ('A'..'C')
$oPrADbl
2
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
22.05.2021, 14:13  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
Нет смысла создавать доп.переменную
смотря где, если я собираю в массив, то удобнее пользоваться переменной и оно уже вошло в привычку
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$aPrA = @()
Function A($w) {
  $w|% {
    $oPrA = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $aPrA += $oPrA
  }
  $aPrA
}
 
$ScriptA = {
  A ('A'..'C')
}
$oPrADbl = $ScriptA.InvokeReturnAsIs()
$oPrADbl
Добавлено через 1 минуту
или как тут тогда правильно7
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
22.05.2021, 14:41
Цитата Сообщение от alpap Посмотреть сообщение
или как тут тогда правильно7
В предыдущем моем сообщении правильно...
В данном случае нет необходимости формировать массив внутри функции, это лишняя, читай бесполезная, трата ресурсов... а при большом количестве элементов ещё и сильно замедляющая выполнение кода...
При вызове функции, она вернет тип объекта: [object[]] с базовым типом System.Array
проверь так:
PowerShell
1
$oPrADbl.gettype()
Этого вполне хватает...
Не понимаю - зачем там скриптблок?
PowerShell
1
2
3
$ScriptA = {
   A ('A'..'C')
}
Который ещё и дергать приходится на выполнение...
1
2802 / 500 / 120
Регистрация: 26.09.2020
Сообщений: 945
Записей в блоге: 5
22.05.2021, 15:35
alpap
Есть и select-object

PowerShell
1
2
3
4
5
6
7
8
9
10
11
'A'..'C' | select @{n="Name$_"; e={'Value : '+$_}}
# или
1..10 | select @{n="Name"; e={"Name$_"}}, @{n="Value"; e={'Value : '+$_}}
 
# или
$s = [char[]]'нафиганонадо_:-)' | select @{n="Name"; e={"Name_$_"}}, @{n="Value"; e={$_}}
-Join $s.value
 
# или с форматированием таблицей и по правому краю поле value
5..15 | select @{n="Name"; e={"Name$_"}}, @{n="Value"; e={'Value : '+$_}} |
    ft name, @{n="Value"; e={$_.Value}; a="right"}
1
 Аватар для bidstrup
419 / 179 / 27
Регистрация: 11.03.2018
Сообщений: 771
22.05.2021, 16:34
Можно и через pscustomobject изворачиваться.
Но заслуженным ветеринарам C++ ближе классический объектный стиль:

[PSHELL]class Croco {
[string] $avatar = '
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
23.05.2021, 22:58
Цитата Сообщение от alpap Посмотреть сообщение
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$aPrA = @()
Function A($w) {
  $w|% {
    $oPrA = [PSCustomObject]@{
      Name  = "Name$_"
      Value = 'Value : '+$_
    }
    $aPrA += $oPrA
  }
  $aPrA
}
 
$ScriptA = {
  A ('A'..'C')
}
$oPrADbl = $ScriptA.InvokeReturnAsIs()
$oPrADbl
Добавлено через 1 минуту
или как тут тогда правильно7
Цитата Сообщение от Fors1k Посмотреть сообщение
PowerShell
1
2
3
4
5
6
7
8
9
10
Function foo($w) {
    $w|% {
        [PSCustomObject]@{
            Name  = "Name$_"
            Value = "Value : $_"
        }
    }
}
$a = foo ('A'..'C')
$a
или
PowerShell
1
2
3
4
5
6
7
8
9
$foo = {
    [PSCustomObject]@{
        Name  = "Name$_"
        Value = "Value : $_"
    }
}
 
$a = 'A'..'C'|% $foo
$a
   
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.05.2021, 22:58
Помогаю со студенческими работами здесь

Передать значение из одной функции в другую
Как из функции GetNewUserId передать значение id в функцию AddUser var usersData = ; function AddUser(GetNewUserId, name,...

Передать массив из одной функции в другую
Доброго времени суток, читатель) Короче, от безделья решил написать программный код, выводящий сначала рандомный массив и следом...

Передать значение из одной функции в другую
Нужно значение max передать в другую функцию Потерялся в указателях :С int MaxEvaluation(Abiturient mas, int x, double *max ){ ...

Передать данные из одной функции в другую и т.д.
Добрый день, подскажите пожалуйста, как передать данные из одной функции в другую, уже весь мозг себе вынес. Вообщем есть 3 функции, в...

Передать переменную из одной функции в другую
Подскажите пожалуйста как передать переменную которая образавалась в одной функции в другую функцию напрмиер из функции one нужно передать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru