Я создаю новый объект (1) с некоторыми свойствами. Я передаю этот объект функции (1), которая затем вызывает другую функцию (2). Функция (2) сама создает объект (2) того же типа и возвращает его с Write-Output
. Затем снова в функции (1) объекту (1) присваивается возвращаемое значение. Поскольку объекты передаются по ссылке, я ожидал, что этот объект (1) будет обновлен за пределами области действия функции. Но это не так.
Основной сценарий:
$RootFolder = "C:\xyz"
. "$RootFolder\FunctionFile - Copy.ps1"
. "$RootFolder\File - Copy.ps1"
$Object_Test = [PSCustomObject]::new()
$Object_Test | Add-Member -MemberType NoteProperty -Name "a" -Value 0
$Object_Test | Add-Member -MemberType NoteProperty -Name "b" -Value 0
Write-Host "Before function call: $Object_Test"
Initialize-ObjectMutation -Object $Object_Test
Write-Host "After function call: $Object_Test"
Функция (1) ('Файл - Copy.ps1'):
function Initialize-ObjectMutation {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)] [PSCustomObject]$Object
)
Write-Host "Before function call (inside): $Object"
$Object = New-Object
Write-Host "After function call (inside): $Object"
}
Функция (2) ('FunctionFile - Copy.ps1'):
function New-Object {
$Object = [PSCustomObject]::new()
$Object | Add-Member -MemberType NoteProperty -Name "a" -Value 1
$Object | Add-Member -MemberType NoteProperty -Name "b" -Value 1
Write-Output $Object
}
Выход:
Before function call: @{a=0; b=0}
Before function call (inside): @{a=0; b=0}
After function call (inside): @{a=1; b=1}
After function call: @{a=0; b=0}
Подскажите, пожалуйста, что я делаю не так, или какую концепцию я здесь неправильно понял? Пожалуйста, не стесняйтесь давать советы, как я могу решить эту проблему лучше. В реальной жизни функция (1) будет делать еще кое-что, и с другой рукой, полной переменных. Фактически это оболочка для функций, подобных функции (2).
1 ответ
Это один из способов заставить его работать, используя мой собственный $ RootFolder. Объект передается по ссылке, и значения копируются из возвращающей функции.
Main.ps1
$RootFolder = "H:\Coding\stack"
. "$RootFolder\FunctionFile - Copy.ps1"
. "$RootFolder\File - Copy.ps1"
$Object_Test = [PSCustomObject]::new()
$Object_Test | Add-Member -MemberType NoteProperty -Name "a" -Value 0
$Object_Test | Add-Member -MemberType NoteProperty -Name "b" -Value 0
Write-Host "Before function call: $Object_Test"
Initialize-ObjectMutation -Object ([ref]$Object_Test)
Write-Host "After function call: $Object_Test"
Файл - Copy.ps1
function Initialize-ObjectMutation {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)][ref]$Object
)
Write-Host "Before function call (inside): $($Object.value)"
$return = New-Object
$Object.value.a = $return.a;
$Object.value.b = $return.b;
Write-Host "After function call (inside): $($Object.value)"
}
FunctionFile - Copy.ps1
function New-Object {
$Object = [PSCustomObject]::new()
$Object | Add-Member -MemberType NoteProperty -Name "a" -Value 1
$Object | Add-Member -MemberType NoteProperty -Name "b" -Value 1
return $Object
}
Полученные результаты
PS H:\Coding\stack> ./main.ps1
Before function call: @{a=0; b=0}
Before function call (inside): @{a=0; b=0}
After function call (inside): @{a=1; b=1}
After function call: @{a=1; b=1}
Похожие вопросы
Новые вопросы
powershell
PowerShell - это кроссплатформенная утилита командной строки и сценариев от Microsoft. Используйте этот тег только для вопросов о написании и выполнении сценариев PowerShell. Вопросы программирования, относящиеся к кроссплатформенной версии PowerShell Core (Windows, macOS и Linux), должны быть помечены [powershell-core]. Вопросы о системном администрировании следует задавать в случае сбоя суперпользователя или сервера.