如何防止命令/脚本改变全局环境

时间:2010-05-30 22:24:11

标签: powershell subshell

我需要从当前的顶级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也不会在全局范围内设置。

还有其他方法可以做到这一点吗?

2 个答案:

答案 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)

没有全球环境这样的东西。在生成新流程时,操作系统会为新流程创建环境副本。

如果你在一个单独的进程中运行脚本,那么它将保持完整。