我需要从当前的顶级shell运行scriptblocks / scripts,我希望它们不会修改全局范围。
到目前为止,我只能想到以下几种可能性:
powershell -file <script>
powershell -noprofile -command <scriptblock>
问题是,它们非常慢。
例如,我希望能够做到:
mkdir newdir
cd newdir
$env:NEW_VAR = 100
ni -item f 'newfile.txt'
...这样我的shell的工作目录就不会改变,$env:NEW_VAR
也不会在全局范围内设置。
还有其他方法可以做到这一点吗?
答案 0 :(得分:2)
我不知道任何其他选择。 @Peter回答时,每个进程都会保留环境变量。
此外,如果您在其中创建新目录和文件,则可以更改全局环境。因此剧本并非完全无辜。
在你的情况下,我会按照你的建议运行新的过程 如果它太懒,将它放入脚本并将其包装到try / finally:
--- script.ps1
push-location
try {
mkdir newdir
cd newdir
$env:NEW_VAR = 100
ni -item f 'newfile.txt'
} finally {
pop-location
# delete dir/file?
remove-item env:NEW_VAR
}
答案 1 :(得分:1)
没有全球环境这样的东西。在生成新流程时,操作系统会为新流程创建环境副本。
如果你在一个单独的进程中运行脚本,那么它将保持完整。