Контейнер "Tab" приравнивается к пространству выполнения (или среда выполнения powershell ) в ISE.Поскольку вы создаете новую вкладку (то есть среду выполнения powershell), переменная v не определена в этой среде выполнения.Блок скриптов оценивается в новой среде выполнения и выдает значение v (ничего).
Легко увидеть, как переменные разрешения отличаются в случае Test-Scriptblock от случая Start-NewTab, если вы попытаетесьчтобы получить переменную в блоке сценария, явно указав область, в которой переменная должна быть найдена.
PS>Test-ScriptBlock { get-variable v -scope 0}
Get-Variable : Cannot find a variable with name 'v'.
PS>Test-ScriptBlock { get-variable v -scope 1}
Get-Variable : Cannot find a variable with name 'v'.
PS>Test-ScriptBlock { get-variable v -scope 2} # Variable found in grandparent scope (global in the same execution environment)
Name Value
---- -----
v hello world
PS>Start-NewTab "Test" { get-variable v -scope 0 } # global scope of new execution environment
Get-Variable : Cannot find a variable with name 'v'.
PS>Start-NewTab "Test" { get-variable v -scope 1 } # proof that scope 0 = global scope
Get-Variable : The scope number '1' exceeds the number of active scopes.
Одним из способов решения вашей проблемы является определение переменной в блоке сценария:
Start-NewTab "Test" { $v = "hello world";$v }
Редактировать: Еще одна вещь, ваш заголовок упоминает «закрытие».Блоки сценариев в Powershell не являются замыканиями, однако вы можете создать замыкание из блока сценариев.Это не поможет вам решить проблему, которую вы описываете.
Edit2: Другой обходной путь:
$v = "hello world"
Invoke-Expression "`$script = { '$v' }"
Start-NewTab "test" $script