Я хочу написать функцию, которая принимает блок сценариев в качестве параметра и выполняет этот блок сценариев в области, в которой он был вызван.
Команда Measure - это пример поведения, которое мне хотелось бы.Скриптблок работает с той же областью действия, что и сама Measure-Command.Если блок сценария ссылается на переменную в этой области, сценарий может изменить ее.
В приложении приведен образец блока сценария, который увеличивает переменную $ a.При вызове Measure-Command переменная увеличивается.Но при вызове функциями Wrapper переменная не будет увеличиваться - если только я не укажу точечный источник, при вызове функции Wrapper и самой функции Wrapper используется точечный источник.
function Wrapper1
{
param( $scriptBlock )
$startTime = Get-Date
Write-Output ( "{0:HH:mm:ss} Start script" -f $startTime )
& $scriptBlock
$endTime = Get-Date
Write-Output ( "{0:HH:mm:ss} End script - {1:c} seconds elapsed" -f $endTime, ( $endTime - $StartTime ) )
}
function Wrapper2
{
param( $scriptBlock )
$startTime = Get-Date
Write-Output ( "{0:HH:mm:ss} Start script" -f $startTime )
. $scriptBlock
$endTime = Get-Date
Write-Output ( "{0:HH:mm:ss} End script - {1:c} seconds elapsed" -f $endTime, ( $endTime - $StartTime ) )
}
$a = 1
Write-Output "Initial state: `$a = $a"
Measure-Command { $a++ } | Out-Null
Write-Output "Measure-Command results: `$a = $a"
Wrapper1 { $a++ }
Write-Output "Wrapper1 results: `$a = $a"
. Wrapper1 { $a++ }
Write-Output "dot-sourced Wrapper1 results: `$a = $a"
Wrapper2 { $a++ }
Write-Output "Wrapper2 results: `$a = $a"
. Wrapper2 { $a++ }
Write-Output "dot-sourced Wrapper2 results: `$a = $a"
Результат выполненияэтот код:
Initial state: $a = 1
Measure-Command results: $a = 2
13:44:49 Start script
13:44:49 End script - 00:00:00 seconds elapsed
Wrapper1 results: $a = 2
13:44:49 Start script
13:44:49 End script - 00:00:00.0157407 seconds elapsed
dot-sourced Wrapper1 results: $a = 2
13:44:49 Start script
13:44:49 End script - 00:00:00 seconds elapsed
Wrapper2 results: $a = 2
13:44:49 Start script
13:44:49 End script - 00:00:00 seconds elapsed
dot-sourced Wrapper2 results: $a = 3
Хотя этот последний вариант работает, я бы хотел избежать синтаксиса точка-источник, вызывающего Wrapper2.Это возможно?Команда Measure не использует синтаксис точка-источник, поэтому кажется, что это возможно.