Windows Powershell 變數的範圍_PowerShell

來源:互聯網
上載者:User

如果我們對變數不做特別的聲明,Powershell解譯器會自動處理和限制變數的範圍。將下面的內容命令儲存著至test1.ps1

$windows = $env:windir“Windows Folder: $windows”

然後在控制台給變數$windows賦值,並調用Test.ps1指令碼。

PS> $windows="Hellow"PS> .\test.ps1Windows Folder: C:\WindowsPS> $windowsHellow

呼叫指令碼時,會分配一個變數$windows,在指令碼調用結束後,這個變數被回收,指令碼中的變數不會影響指令碼外的變數,因為它們在不同的範圍中。powershell會針對每個函數和指令碼給它們分配不同的範圍。

更改變數的可見度
你可以很容易的看到沒有Powershell解譯器自動限制可見度時會發生什麼狀況,同樣是剛才的指令碼,剛才的命令,只是在運行指令碼時多加上一個點”.” 和一個空格:

PS> $windows="Hellow"PS> . .\test.ps1Windows Folder: C:\WindowsPS> $windowsC:Windows

在運行指令碼時使用一個原點和空格,Powershell解譯器就不會為指令碼本身建立自己的變數範圍,它會共用當前控制台的範圍,這種不太靈活但卻簡單的方法,使用時一定要格外小心。

加強變數可見度限制的優點:清空初始化環境
可以假設一個情境,如果你在當前控制台不小心定義了一個唯讀常量,這個常量既不能更新也不能刪除,很是麻煩。但是如果你在指令碼中操作這個變數就不成問題,因為指令碼有自己的範圍。例如,將下面文本儲存為test.ps1,並調用沒有任何問題:

New-Variable a -value 1 -option Constant"Value: $a"PS> .\test.ps1Value: 1PS> .\test.ps1Value: 1

但是如果你通過圓點禁用範圍限制,調用test.ps1,就會有異常,因為一個常量不能被建立兩次。

PS> . .\test.ps1Value: 1PS> . .\test.ps1New-Variable : A variable with name 'a' already exists.Attest.ps1:1 char:13+ New-Variable <<<< a -value 1 -option Constant  + CategoryInfo     : ResourceExists: (a:String) [New-Variable], SessionStateException  + FullyQualifiedErrorId : VariableAlreadyExists,Microsoft.PowerShell.Commands.NewVariableCommand

所以這種變數的範圍限制可以把變數的衝突降到最小。

設定單個變數的範圍
到目前為止,看到的變數範圍的改變都是全域的,能不能針對某個具體變數的範圍做一些個人化的設定。

$global
全域變數,在所有的範圍中有效,如果你在指令碼或者函數中設定了全域變數,即使指令碼和函數都運行結束,這個變數也任然有效。

$script
指令碼變數,只會在指令碼內部有效,包括指令碼中的函數,一旦指令碼運行結束,這個變數就會被回收。

$private
私人變數,只會在當前範圍有效,不能貫穿到其他範圍。

$local
預設變數,可以省略修飾符,在當前範圍有效,其它範圍只對它有唯讀許可權。

開啟Powershell控制台後,Powershell會自動產生一個新的全域範圍。如果增加了函數和指令碼,或者特殊的定義,才會產生其它範圍。在當前控制台,只存在一個範圍,通過修飾符訪問,其實訪問的是同一個變數:

PS> $logo="www.jb51.net"PS> $logowww.jb51.netPS> $private:logowww.jb51.netPS> $script:logowww.jb51.netPS> $private:logowww.jb51.netPS> $global:logowww.jb51.net

當調用一個已定義的函數,Powershell會產生第二個範圍,它可以對調用者的範圍中的變數執行讀操作,但是不能執行寫操作。

PS> function f(){ "var=$var";$var="function inner";$var }PS> $var="I am in console."PS> $varI am in console.PS> fvar=I am in console.function innerPS> $varI am in console.

怎樣把當前控制台中的變數保護起來,不讓它在函數和指令碼中被訪問,Private修飾符就派上了用場。

PS> function f(){ "var=$var";$var="function inner";$var }PS> $private:var="i am a private variable in console,other scope can not access me."PS> fvar=function innerPS> $private:vari am a private variable in console,other scope can not access me.

對於$private限制的變數能不能在函數中通過$global修改呢?不但不能修改,還會刪除當前的$private變數

PS> Function f(){ "var=$var";$global:var=" Try to change variable in function"}PS> $private:var="I am a private variable"PS> $private:varI am a private variablePS> $varI am a private variablePS> fvar=PS> $private:varPS> $varPS>PS> $private -eq $nullTrue

但是$local 修飾的變數則可以通過$global在函數內部更改。

PS> Function f(){ "var=$var";$global:var=" Try to change variable in function"}PS> $var="I am a local variable."PS> $varI am a local variable.PS> $private:varI am a local variable.PS> fvar=I am a local variable.PS> $var Try to change variable in functionPS> $local:var Try to change variable in function

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.