Powershell 脚本:为什么此函数无法访问全局变量

Powershell scripting : Why is this function not able to access a global variable

我有一个脚本,假设 script1 从 script2 调用函数 abc。 下面是 script2 :-

$Global:splat2 
function xyz ()
{
    Write-Host "in xyz"
    Write-Host "$Global:splat2"
}
function abc ([System.Collections.ArrayList] $splat)
{
    $Global:splat2 = $splat
    Write-Host "in abc"
    Write-Host "$Global:splat2"
    $func = (Get-Command -Type Function xyz)
    $wholeFuncDef = 'Function ' + $func.Name + " {`n" + $func.Definition + "`n}"

    Start-Process powershell -args '-noprofile', '-noexit', '-EncodedCommand', `([Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes("$wholeFuncDef; xyz")))
    
}

函数 abc 从脚本 1 调用(一些值被分配给 $splat):

abc $splat

问题是只有函数 abc 打印 $splat2 的值,而在函数 xyz 中,$splat2 是空的。 我期望函数 xyz 也应该具有 $splat2 的值,因为它是一个全局变量。

全局变量仅限于给定的 会话,即给定进程内的 PowerShell 运行空间(线程)。

Start-Processpowershell.exe一起使用总是会在新进程中创建一个会话,它知道与调用者的变量无关(默认情况下继承 environment 变量除外)。


您必须显式将调用者作用域中的任何值传递给这样一个单独的会话。

选项:

  • 将调用者作用域中的值作为 variable-assignment 语句合并到传递给 -EncodedCommand

    的(Base64 编码)命令字符串中
  • 一个简单的替代方法确实是使用辅助。 环境变量。

注意数据类型:

  • 如果使用环境变量,它的值总是字符串.

  • 如果在命令字符串中加入变量赋值,可以表达更多的数据类型,但仅限于可以表达为文字的数据类型PowerShell(除非您包含基于文字的构造函数调用,如果可行的话)。

  • 支持 more 数据类型 - 但不支持 all - 可以使用 - 在撰写本文时未记录 - -EncodedArguments参数;参见