Run one PowerShell script from another without inheriting variables and scope
通常在PowerShell中可以正常工作:
1 2 3 4 | # parent.ps1 $x = 1 &"$PSScriptRoot/child.ps1" |
1 2 3 | # child.ps1 Write-Host $x |
我的脚本可以防止这种情况吗?
我可以做
是否可以在不继承作用域的情况下调用
还是一种将所有内容标记为私有的方式?
否,除非使用
也就是说,在给定范围(没有
此外,某些自动(内置)变量是使用选项
解决方法:
-
进行中:
-
使用
Start-ThreadJob (PowerShell v6)或ForEach-Object -Parallel (v7)通过线程作业调用脚本;例如:-
ForEach-Object -Parallel { $PSScriptRoot/child.ps1 } -
线程作业和
ForEach-Object -Parallel 创建的线程不继承调用者的状态(v7中的当前位置除外)[1]。
-
-
在脚本的开头,通过
Get-Variable 枚举所有变量,并创建您明确设置为$null 的本地副本(您将需要忽略由于无法覆盖的内置变量而引起的错误)-将有效地将变量隐藏在祖先范围内。
-
-
进程外:
-
通过新的PowerShell进程(
powershell -File ... 或pwsh -File ... )或后台作业(使用Start-Job )调用脚本。- 注意:除了性能降低外,由于跨进程XML序列化序列化类型的保真度可能会丢失-有关详细信息,请参见此答案。
-
通过新的PowerShell进程(
[1]请注意,现在正在考虑提供一个选择加入程序,以将调用者的状态复制到