2010-05-30 40 views
1

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

有没有更多的选择来实现这一目标?

回答

1

世界上没有这样的东西。当产生一个新的进程时,操作系统为新进程创建一个环境的副本。

如果你在一个单独的进程中运行脚本,当它离开一切都会完好无损。

+2

我想我的意思是“范围”,而不是“环境”。 – guillermooo 2010-05-31 18:37:07

2

我不知道任何其他的选择。当@Peter回答时,每个进程都保留环境变量。

此外,如果你在那里创建新的目录和文件,那么你改变了全球环境。所以剧本不是完全无辜的。

在你的情况下,我会按照你的建议运行新的进程。
如果是太懒,把它放到一个脚本,并将其包装成的try /最后:

--- 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 
}