Windows Powershell 變量的作用域
如果我們對(duì)變量不做特別的聲明,Powershell解釋器會(huì)自動(dòng)處理和限制變量的作用域。將下面的內(nèi)容命令保存著至test1.ps1
$windows = $env:windir “Windows Folder: $windows”
然后在控制臺(tái)給變量$windows賦值,并調(diào)用Test.ps1腳本。
PS> $windows="Hellow" PS> .\test.ps1 Windows Folder: C:\Windows PS> $windows Hellow
調(diào)用腳本時(shí),會(huì)分配一個(gè)變量$windows,在腳本調(diào)用結(jié)束后,這個(gè)變量被回收,腳本中的變量不會(huì)影響腳本外的變量,因?yàn)樗鼈冊(cè)诓煌淖饔糜蛑?。powershell會(huì)針對(duì)每個(gè)函數(shù)和腳本給它們分配不同的作用域。
更改變量的可見性
你可以很容易的看到?jīng)]有Powershell解釋器自動(dòng)限制可見性時(shí)會(huì)發(fā)生什么狀況,同樣是剛才的腳本,剛才的命令,只是在運(yùn)行腳本時(shí)多加上一個(gè)點(diǎn)”.” 和一個(gè)空格:
PS> $windows="Hellow" PS> . .\test.ps1 Windows Folder: C:\Windows PS> $windows C:Windows
在運(yùn)行腳本時(shí)使用一個(gè)原點(diǎn)和空格,Powershell解釋器就不會(huì)為腳本本身創(chuàng)建自己的變量作用域,它會(huì)共享當(dāng)前控制臺(tái)的作用域,這種不太靈活但卻簡(jiǎn)單的方法,使用時(shí)一定要格外小心。
加強(qiáng)變量可見性限制的優(yōu)點(diǎn):清空初始化環(huán)境
可以假設(shè)一個(gè)場(chǎng)景,如果你在當(dāng)前控制臺(tái)不小心定義了一個(gè)只讀的常量,這個(gè)常量既不能更新也不能刪除,很是麻煩。但是如果你在腳本中操作這個(gè)變量就不成問題,因?yàn)槟_本有自己的作用域。例如,將下面文本保存為test.ps1,并調(diào)用沒有任何問題:
New-Variable a -value 1 -option Constant "Value: $a"PS> .\test.ps1 Value: 1 PS> .\test.ps1 Value: 1
但是如果你通過圓點(diǎn)禁用作用域限制,調(diào)用test.ps1,就會(huì)有異常,因?yàn)橐粋€(gè)常量不能被創(chuàng)建兩次。
PS> . .\test.ps1 Value: 1 PS> . .\test.ps1 New-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
所以這種變量的作用域限制可以把變量的沖突降到最小。
設(shè)置單個(gè)變量的作用域
到目前為止,看到的變量作用域的改變都是全局的,能不能針對(duì)某個(gè)具體變量的作用域做一些個(gè)性化的設(shè)置。
$global
全局變量,在所有的作用域中有效,如果你在腳本或者函數(shù)中設(shè)置了全局變量,即使腳本和函數(shù)都運(yùn)行結(jié)束,這個(gè)變量也任然有效。
$script
腳本變量,只會(huì)在腳本內(nèi)部有效,包括腳本中的函數(shù),一旦腳本運(yùn)行結(jié)束,這個(gè)變量就會(huì)被回收。
$private
私有變量,只會(huì)在當(dāng)前作用域有效,不能貫穿到其他作用域。
$local
默認(rèn)變量,可以省略修飾符,在當(dāng)前作用域有效,其它作用域只對(duì)它有只讀權(quán)限。
打開Powershell控制臺(tái)后,Powershell會(huì)自動(dòng)生成一個(gè)新的全局作用域。如果增加了函數(shù)和腳本,或者特殊的定義,才會(huì)生成其它作用域。在當(dāng)前控制臺(tái),只存在一個(gè)作用域,通過修飾符訪問,其實(shí)訪問的是同一個(gè)變量:
PS> $logo="www.dbjr.com.cn" PS> $logo www.dbjr.com.cn PS> $private:logo www.dbjr.com.cn PS> $script:logo www.dbjr.com.cn PS> $private:logo www.dbjr.com.cn PS> $global:logo www.dbjr.com.cn
當(dāng)調(diào)用一個(gè)已定義的函數(shù),Powershell會(huì)生成第二個(gè)作用域,它可以對(duì)調(diào)用者的作用域中的變量執(zhí)行讀操作,但是不能執(zhí)行寫操作。
PS> function f(){ "var=$var";$var="function inner";$var } PS> $var="I am in console." PS> $var I am in console. PS> f var=I am in console. function inner PS> $var I am in console.
怎樣把當(dāng)前控制臺(tái)中的變量保護(hù)起來,不讓它在函數(shù)和腳本中被訪問,Private修飾符就派上了用場(chǎng)。
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> f var= function inner PS> $private:var i am a private variable in console,other scope can not access me.
對(duì)于$private限制的變量能不能在函數(shù)中通過$global修改呢?不但不能修改,還會(huì)刪除當(dāng)前的$private變量
PS> Function f(){ "var=$var";$global:var=" Try to change variable in function"} PS> $private:var="I am a private variable" PS> $private:var I am a private variable PS> $var I am a private variable PS> f var= PS> $private:var PS> $var PS> PS> $private -eq $null True
但是$local 修飾的變量則可以通過$global在函數(shù)內(nèi)部更改。
PS> Function f(){ "var=$var";$global:var=" Try to change variable in function"} PS> $var="I am a local variable." PS> $var I am a local variable. PS> $private:var I am a local variable. PS> f var=I am a local variable. PS> $var Try to change variable in function PS> $local:var Try to change variable in function
相關(guān)文章
Powershell 之批量獲取文件大小的實(shí)現(xiàn)代碼
這篇文章主要介紹了Powershell 之批量獲取文件大小的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-11-11PowerShell入門教程之訪問.Net程序集、COM和WMI實(shí)例
這篇文章主要介紹了PowerShell入門教程之訪問.Net程序集、COM和WMI實(shí)例,本文講解了PowerShell作為Windows平臺(tái)的脫水語言來訪問其它資源的例子,需要的朋友可以參考下2014-10-10Windows Powershell對(duì)象=屬性+方法
從今天開始,我們這個(gè)系列的教程進(jìn)入到講訴使用對(duì)象的階段,那么本階段的第一篇還是先來熟悉下概念,簡(jiǎn)單的說對(duì)象=屬性+方法2014-09-09PowerShell中字符串使用單引號(hào)和雙引號(hào)的區(qū)別
這篇文章主要介紹了PowerShell中字符串使用單引號(hào)和雙引號(hào)的區(qū)別,大家可能會(huì)經(jīng)常遇到這個(gè)問題,需要的朋友可以參考下2014-08-08Powershell小技巧之系統(tǒng)運(yùn)行時(shí)間
本文主要教你如何使用powershell計(jì)算系統(tǒng)運(yùn)行時(shí)間,其實(shí)很簡(jiǎn)單,因?yàn)閃indows每次啟動(dòng)都有一個(gè)高進(jìn)度計(jì)數(shù)器并且當(dāng)系統(tǒng)運(yùn)行這個(gè)計(jì)數(shù)器將返回一個(gè)毫秒,我們把這個(gè)毫秒計(jì)算下就得到系統(tǒng)運(yùn)行時(shí)間了2014-09-09PowerShell小技巧之使用New-Module命令動(dòng)態(tài)創(chuàng)建對(duì)象
這篇文章主要介紹了在PowerShell中使用New-Module命令動(dòng)態(tài)創(chuàng)建對(duì)象,比New-Object高大上很多了吧2014-09-09PowerShell中使用ArrayList實(shí)現(xiàn)數(shù)組插入、刪除、添加例子
這篇文章主要介紹了PowerShell中使用ArrayList實(shí)現(xiàn)數(shù)組插入、刪除、添加例子,使用ArrayList效率更高、也更方便,需要的朋友可以參考下2014-08-08Windows Powershell創(chuàng)建對(duì)象
.Net類型中的方法功能很強(qiáng)大??梢酝ㄟ^類型的構(gòu)造函數(shù)創(chuàng)建新的對(duì)象,也可以將已存在的對(duì)象轉(zhuǎn)換成指定的類型。2014-10-10