2010-05-30 57 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 
}