Windows Powershell 變量的作用域
如果我們對變量不做特別的聲明,Powershell解釋器會自動處理和限制變量的作用域。將下面的內(nèi)容命令保存著至test1.ps1
$windows = $env:windir “Windows Folder: $windows”
然后在控制臺給變量$windows賦值,并調(diào)用Test.ps1腳本。
PS> $windows="Hellow" PS> .\test.ps1 Windows Folder: C:\Windows PS> $windows Hellow
調(diào)用腳本時,會分配一個變量$windows,在腳本調(diào)用結(jié)束后,這個變量被回收,腳本中的變量不會影響腳本外的變量,因為它們在不同的作用域中。powershell會針對每個函數(shù)和腳本給它們分配不同的作用域。
更改變量的可見性
你可以很容易的看到?jīng)]有Powershell解釋器自動限制可見性時會發(fā)生什么狀況,同樣是剛才的腳本,剛才的命令,只是在運行腳本時多加上一個點”.” 和一個空格:
PS> $windows="Hellow" PS> . .\test.ps1 Windows Folder: C:\Windows PS> $windows C:Windows
在運行腳本時使用一個原點和空格,Powershell解釋器就不會為腳本本身創(chuàng)建自己的變量作用域,它會共享當(dāng)前控制臺的作用域,這種不太靈活但卻簡單的方法,使用時一定要格外小心。
加強(qiáng)變量可見性限制的優(yōu)點:清空初始化環(huán)境
可以假設(shè)一個場景,如果你在當(dāng)前控制臺不小心定義了一個只讀的常量,這個常量既不能更新也不能刪除,很是麻煩。但是如果你在腳本中操作這個變量就不成問題,因為腳本有自己的作用域。例如,將下面文本保存為test.ps1,并調(diào)用沒有任何問題:
New-Variable a -value 1 -option Constant "Value: $a"PS> .\test.ps1 Value: 1 PS> .\test.ps1 Value: 1
但是如果你通過圓點禁用作用域限制,調(diào)用test.ps1,就會有異常,因為一個常量不能被創(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è)置單個變量的作用域
到目前為止,看到的變量作用域的改變都是全局的,能不能針對某個具體變量的作用域做一些個性化的設(shè)置。
$global
全局變量,在所有的作用域中有效,如果你在腳本或者函數(shù)中設(shè)置了全局變量,即使腳本和函數(shù)都運行結(jié)束,這個變量也任然有效。
$script
腳本變量,只會在腳本內(nèi)部有效,包括腳本中的函數(shù),一旦腳本運行結(jié)束,這個變量就會被回收。
$private
私有變量,只會在當(dāng)前作用域有效,不能貫穿到其他作用域。
$local
默認(rèn)變量,可以省略修飾符,在當(dāng)前作用域有效,其它作用域只對它有只讀權(quán)限。
打開Powershell控制臺后,Powershell會自動生成一個新的全局作用域。如果增加了函數(shù)和腳本,或者特殊的定義,才會生成其它作用域。在當(dāng)前控制臺,只存在一個作用域,通過修飾符訪問,其實訪問的是同一個變量:
PS> $logo="www.dhdzp.com" PS> $logo www.dhdzp.com PS> $private:logo www.dhdzp.com PS> $script:logo www.dhdzp.com PS> $private:logo www.dhdzp.com PS> $global:logo www.dhdzp.com
當(dāng)調(diào)用一個已定義的函數(shù),Powershell會生成第二個作用域,它可以對調(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)前控制臺中的變量保護(hù)起來,不讓它在函數(shù)和腳本中被訪問,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> f
var=
function inner
PS> $private:var
i am a private variable in console,other scope can not access me.
對于$private限制的變量能不能在函數(shù)中通過$global修改呢?不但不能修改,還會刪除當(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中Get-Date對象的常用屬性和方法介紹
這篇文章主要介紹了PowerShell中Get-Date對象的常用屬性和方法介紹,一并介紹了看一個對象的所有屬性和方法的技巧,需要的朋友可以參考下2014-08-08
PowerShell入門教程之高效使用PowerShell交互式運行環(huán)境的幾個小技巧
這篇文章主要介紹了PowerShell入門教程之高效使用PowerShell交互式運行環(huán)境的幾個小技巧,本文也可以說是使用PowerShell的一些好習(xí)慣,需要的朋友可以參考下2014-10-10
Powershell小技巧之獲取當(dāng)前的時間并轉(zhuǎn)換為時辰
這篇文章主要介紹了使用Powershell獲取當(dāng)前的時間并轉(zhuǎn)換為時辰的方法,非常簡單實用,有需要的朋友可以參考下2014-09-09
Powershell小技巧之創(chuàng)建短網(wǎng)址
短網(wǎng)址服務(wù),可能很多朋友都已經(jīng)不再陌生,特別是在微博應(yīng)用中十分普遍,比如,當(dāng)我們在騰訊、新浪微博發(fā)微博時有時發(fā)很長的網(wǎng)址連接,但由于微博只限制140個字,所以微博就自動把您發(fā)的長網(wǎng)址給轉(zhuǎn)換成短網(wǎng)址了。今天我們來探討下,如何用powershell來便捷的使用短網(wǎng)址2014-10-10
你應(yīng)該選擇 Powershell 的10個理由(拋棄 cmd)
Windows平臺的開發(fā)者們,是時候拋棄 cmd 了,這篇文章主要介紹了你應(yīng)該選擇 Powershell 的10個理由,需要的朋友可以參考下2017-10-10
使用HTTP api簡單的遠(yuǎn)程執(zhí)行PowerShell腳本
為了你能非常簡單的遠(yuǎn)程執(zhí)行PoweShell腳本,使用REST API是一個很好的選擇,因為現(xiàn)在許多流行的編程語言都可以簡單的執(zhí)行HTTP的GET操作。2014-10-10

