Итак, я попытался найти ответ на этот вопрос и обнаружил, что общедоступным ответом является то, что PowerShell передает параметры по значению. Эти общепринятые решения все после кода образца, чтобы доказать свои утверждения, аналогично следующему:
Function add1 ($parameter)
{
Write-Host " In Function: `$parameter = $parameter"
Write-Host " In Function: `$parameter += 1"
$parameter += 1
Write-Host " In Function: `$parameter = $parameter"
}
cls
$a = 1
Write-Host "Before function: `$a = $a"
add1 $a
Write-Host " After function: `$a = $a"
Это дает результаты:
Before function: Run Command: $a = 1
In Function: $parameter: 1
In Function: Run Command: $parameter += 1
In Function: $parameter: 2
After function: $a: 1
Таким образом, доказывая, что параметры передаются по значению, правильно? Ну, у меня было чертовски много времени на устранение неполадок с функцией, которую я писал. Функция добавила несколько дополнительных элементов NoteProperty к объекту PSCustomObject, который я передал функции, и моя программа выдала бы все виды ошибок, говоря, что NoteProperty уже существует, даже если я не изменял исходный объект в родительской области, только внутри функции.
Итак, я настроил версию вышеприведенного кода для проверки с использованием параметра типа [PSCustomObject], например так:
Function F1($Obj)
{
'Function F1: Run command: $Obj.FirstValue = 11'
$Obj.FirstValue = 11
" `$Obj.Name: $($StartObject.Name)"
" `$Obj.FirstValue: $($StartObject.FirstValue)"
" `$Obj.SecondValue: $($StartObject.SecondValue)"
}
Function F2($Obj)
{
'Function F2: Run command: $Obj | Add-Member -MemberType NoteProperty -Name SecondValue -Value 33'
$obj | Add-Member -MemberType NoteProperty -Name SecondValue -Value 33
" `$Obj.Name: $($StartObject.Name)"
" `$Obj.FirstValue: $($StartObject.FirstValue)"
" `$Obj.SecondValue: $($StartObject.SecondValue)"
}
cls
Remove-Variable StartObject
"Main script: Run command: `$StartObject = [PSCustomObject]@{Name='Original';FirstValue=22}"
$StartObject = [PSCustomObject]@{Name='Original';FirstValue=22}
" `$StartObject.Name: $($StartObject.Name)"
" `$StartObject.FirstValue: $($StartObject.FirstValue)"
" `$StartObject.SecondValue: $($StartObject.SecondValue)"
'Run command: F1 $StartObject'
" "
F1 $StartObject
" "
"Main script: `$StartObject.Name: $($StartObject.Name)"
" `$StartObject.FirstValue: $($StartObject.FirstValue)"
" `$StartObject.SecondValue: $($StartObject.SecondValue)"
"Run command: F2 $StartObject"
" "
F2 $StartObject
" "
"Main script: `$StartObject.Name = $($StartObject.Name)"
" `$StartObject.FirstValue = $($StartObject.FirstValue)"
" `$StartObject.SecondValue = $($StartObject.SecondValue)"
Этот грязный фрагмент программирования создает следующий вывод:
Main script: Run command: $StartObject = [PSCustomObject]@{Name='Original';FirstValue=22}
$StartObject.Name: Original
$StartObject.FirstValue: 22
$StartObject.SecondValue:
Run command: F1 $StartObject
Function F1: Run command: $Obj.FirstValue = 11
$Obj.Name: Original
$Obj.FirstValue: 11
$Obj.SecondValue:
Main script: $StartObject.Name: Original
$StartObject.FirstValue: 11
$StartObject.SecondValue:
Run command: F2 @{Name=Original; FirstValue=11}
Function F2: Run command: $Obj | Add-Member -MemberType NoteProperty -Name SecondValue -Value 33
$Obj.Name: Original
$Obj.FirstValue: 11
$Obj.SecondValue: 33
Main script: $StartObject.Name = Original
$StartObject.FirstValue = 11
$StartObject.SecondValue = 33
Эти результаты ясно показывают, что при использовании параметров [PSCustomObject] любые изменения в функции происходят в переданном объекте, таким образом, передаются по ссылке. Это происходит независимо от определения моих параметров как [PSCustomObject] $ Obj или без их изменения. Само по себе это не является большой проблемой, но проблема в том, что я не смог найти этот маленький драгоценный камень информации ни в одной из просмотренных мной документов. Я проверил несколько учебных сайтов и собственную документацию Microsoft по параметрам функций, но не увидел этого исключения.
Итак, мой вопрос сводится к следующему: кто-нибудь нашел какую-либо документацию, поддерживающую мою теорию, хотя большинство параметров по умолчанию чтобы передать по значению, они передаются по ссылке, когда речь идет об объектах?
Я совершенно готов поверить, что где-то пропустил какую-то документацию, поэтому, пожалуйста ... укажите это и покажите мне ошибку моих путей ! :)
Большое спасибо