Контейнер «Tab» приравнивается к пробелу (или powershell execution environment) в 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.
Один из способов для вашей проблемы, чтобы определить переменную в ScriptBlock:
Start-NewTab "Test" { $v = "hello world";$v }
Edit: Еще одна вещь, ваше название упоминает 'закрытие'. Scriptblocks в Powershell не являются закрытием, однако вы можете создать закрытие из скриптового блока. Однако это не поможет вам с проблемой, которую вы описываете.
Edit2: Другой обходной путь:
$v = "hello world"
Invoke-Expression "`$script = { '$v' }"
Start-NewTab "test" $script
Как это поможет, если я мог бы создать необходимые данные в ScriptBlock, я не должен был бы использовать переменную –
Я не уверен, что ограничения для вашей конкретной проблемы, однако я обновил свой пост с помощью другого обходного пути. –