為什麼 PowerShell ISE 不將腳本變數隔離到腳本範圍?

為什麼 PowerShell ISE 不將腳本變數隔離到腳本範圍?

在 PowerShell 中,作用域應該可防止腳本中的物件(變數、別名、函數等)影響全域環境。這似乎在命令列中運作良好,但在 ISE 中則不然。

這是控制台中的示範。我檢查是否$x未在全域範圍內定義,顯示內容ScopeTest.ps1然後運行它,最後檢查是否$x再次定義。如預期的那樣,$x僅在腳本範圍​​內建立和使用,並且在腳本終止後不會保留在全域環境中。

在此輸入影像描述

在 ISE 中,如果使用控制台視窗呼叫腳本,這似乎確實有效。

在此輸入影像描述

但是,如果我實際上使用“運行腳本”按鈕或 F5,腳本中的變數將在完成後保留。

在此輸入影像描述

如果腳本假設將從乾淨的環境啟動(即:腳本中設定的任何變數不應該存在),這可能會使腳本的編寫和故障排除變得有點困難。為什麼 ISE 會有這樣的行為?

一個答案這個問題稍微觸及這個主題,提到“點源”,但我希望在這裡得到更徹底的解釋。此外,如果存在說明為什麼腳本在 ISE 中與在控制台中運行方式不同的文檔,那麼參考也很好。

答案1

在您的腳本範例中,您建立了變量,並且沒有在腳本結束時銷毀它們。 ISE 會建立 powershell 的即時實例,當您按一下「執行」時,該實例會載入並執行腳本。不同之處在於整合的 shell 可以繼續執行腳本。這非常適合調試環境和創建腳本。這樣,您就不必一遍又一遍地運行腳本(在某些情況下這並不理想)來確保下一行程式碼正常運作。您在 shell 中輸入它,如果有效,則將其新增至腳本部分。

這種行為也許在這裡得到最好的描述: http://technet.microsoft.com/en-us/library/dd819480.aspx

相關摘錄:

ISE 中的所有窗格始終位於相同範圍內。

如果您不希望變數在腳本完成後保留在 shell 中,那麼您應該Remove-Variable這樣做。

例如:

Remove-Variable x

您可以透過點擊「檔案」->「新建 Powershell」標籤將 powershell 的「乾淨」實例新增至 ISE

答案2

在 ISE Powershell 中,本質上是將腳本轉儲到 shell,然後執行它。就好像您在 shell 中輸入它,然後執行它一樣。因此該變數可用於該會話。要查看其他差異,請查看此微軟軟體定義網絡郵政。

答案3

因此 ISE 的範圍是全球性的。除非您刪除在 ISE 中工作時建立的所有變量,否則所有變數在腳本運行後都將可用。當我使用 ISE 建置腳本時,我將始終開啟不同的 PowerShell 控制台進行測試。這使我能夠確保一切都按我的預期進行。

相關內容