(8)Powershell中变量的定义和使用
这一节主要介绍Powershell中变量的定义和使用,以及使用变量时应该注意的事项。
和所有编程语言中的变量一样,Powershell中的变量也是存于存储值的内存单元,需要注意的是,Powershell中的变量是以美元符号($)开头的单字节(一般是英文字符,虽然ISE中支持双字节的字符,但是像任何编程语言,我们不鼓励不赞成使用中文等命名的变量)文本字符串表示,如 $a, $b 或者是 $my_str。
①变量命名
powershell中变量以美元符”$”开始,其余字符可以是字母、下划线、数字任意字符,不区分大小。
②变量赋值与交换
PS C:\Powershell> $A=12
PS C:\Powershell> $A
12
PS C:\Powershell> $a
12
PS C:\Powershell> $a=10
PS C:\Powershell> $b=20
PS C:\Powershell> $a
10
PS C:\Powershell> $a,$b=$b,$a
PS C:\Powershell> $A
20
③查看变量
Powershell把变量的相关信息存放在variable:的驱动中。查看所有定义的变量的命令“ls variable:”,查询以a开头的变量如下:
PS C:\Powershell> $a1,$a2,$a3=10,20,30
PS C:\Powershell> ls variable:a*
Name Value
---- -----
a 20
a1 10
a3 30
a2 20
args {}
PS C:\Powershell> $a=$NULL
PS C:\Powershell> ls variable:a*
Name Value
---- -----
a
a1 10
a3 30
a2 20
args {}
④环境变量
$env:中的环境变量只是电脑环境变量的一个副本,除了用.NET方法更新环境变量,其他的更改在下一次重新打开时,会恢复如初。
通过$env:提示powershell忽略基本的variable:驱动器,先去环境变量env:驱动器中寻找变量。
通过“ls env:”可以查询所有的环境变量,通过“$env:name”就可以访问指定name的环境变量了。
PS C:\Powershell> ls env:
Name Value
---- -----
__PSLockDownPolicy 0
ALLUSERSPROFILE C:\ProgramData
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program Files\Common Files
COMPUTERNAME DLC5CG1464WOPL
ComSpec C:\WINDOWS\system32\cmd.exe
DriverData C:\Windows\System32\Drivers\DriverData
HOMEDRIVE C:
LOGONSERVER \\SGPDC3220
NEXTHINK C:\Program Files\Nexthink\Collector
NUMBER_OF_PROCESSORS 8
Path C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system3...
PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
PROCESSOR_ARCHITECTURE AMD64
PROCESSOR_IDENTIFIER Intel64 Family 6 Model 140 Stepping 1, GenuineIntel
PROCESSOR_LEVEL 6
PROCESSOR_REVISION 8c01
ProgramData C:\ProgramData
ProgramFiles C:\Program Files
ProgramFiles(x86) C:\Program Files (x86)
ProgramW6432 C:\Program Files
环境变量的创建和删除:
PS C:\Powershell> $env:AMT="6666666"
PS C:\Powershell> $env:AMT2="333333"
PS C:\Powershell> del $env:AMT2
del : Cannot find path 'C:\Powershell\333333' because it does not exist.
At line:1 char:1
+ del $env:AMT2
+ ~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Powershell\333333:String) [Remove-Item], ItemNotFoundExcep
tion
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand
PS C:\Powershell> del env:AMT2
PS C:\Powershell> ls env:
Name Value
---- -----
__PSLockDownPolicy 0
ALLUSERSPROFILE C:\ProgramData
AMT 6666666
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program Files\Common Files
COMPUTERNAME DLC5CG1464WOPL
ComSpec C:\WINDOWS\system32\cmd.exe
(5)变量的作用域
$global:全局变量,在所有的作用域有效。
$script:脚本变量,在脚本内部有效。
$private:私有变量,在当前作用域有效。
$local:默认变量,在当前作用域有效,其它作用域对它只有可读权限。
PS C:\Powershell> $global:a=10
PS C:\Powershell> $Private:b=20
PS C:\Powershell> $Script:c=30
PS C:\Powershell> $Local:d=40
(6)强类型
给变量指定类型。
PS C:\Powershell> [double]$dou=1.2
PS C:\Powershell> $dou.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Double System.ValueType
在Powershell中有3种不同的变量。
-
用户自己创建的变量
用户创建的变量由用户创建和维护。默认情况下,在 PowerShell 命令行中创建的变量只在当前PowerShell 窗口有效。关闭该窗口后,变量也会自动销毁(再次打开命令窗口不再存在,不能再引用之前定义的变量)。若要保存变量并使其在窗口关闭并再次打开时仍然有效,需要将其添加到 PowerShell 配置文件中(但并不建议这么做)。如果是在编写脚本,则可以在脚本中创建具有全局或局部作用域的变量。 -
自动变量
自动变量也称为内置变量,用于存储 PowerShell 的一些状态信息。这些变量由 PowerShell 创建和维护,PowerShell 根据需要更改变量值以保持其准确性。用户不能更改这些变量的值。例如,$PSHome 变量存储 PowerShell 安装目录的路径。 -
首选项变量
首选项变量就是Powershell当前命令窗口环境的首选项设置,这些变量由Powershell创建,并以默认值填充,用户可以更改这些变量的值,如 $MaximumHistoryCount 是历史记录的最大条数。
变量的定义和使用
创建(定义)新变量或更改变量的值,请使用以下格式的赋值语句
$<variable> = <value>
例如以下定义了字符串变量 $myStr 并修改了其值。如果要显示变量的值,直接输入变量的名称,包括美元符号$。
PS C:\WINDOWS\system32> $myStr="This variables defined by user"
PS C:\WINDOWS\system32> $myStr
This variables defined by user
PS C:\WINDOWS\system32> $myStr="user has changed the value of this variables"
PS C:\WINDOWS\system32> $myStr
user has changed the value of this variables
在定义和使用变量时,可以使用单引号和双引号,但需要注意单引号和双引号的区别。
PS C:\WINDOWS\system32> $myStr='this is string variables'
PS C:\WINDOWS\system32> $youStr='your want to display the $myStr'
PS C:\WINDOWS\system32> $youStr
your want to display the $myStr
注意上面的变量定义使用的单引号,变量 $youStr 中的变量 $myStr 并没有替换为其所代表的值,而是直接输出,意味单引号中的内容会直接输出,不做变量值的替换。
PS C:\WINDOWS\system32> $myStr="this is string variables"
PS C:\WINDOWS\system32> $youStr="your want to display the $myStr"
PS C:\WINDOWS\system32> $youStr
your want to display the this is string variables
注意上边的变量的定义使用的双引号,变量$youStr 中的变量 $myStr 会替换为其所代表的值,意味着双引号中的变量名在会替换为变量所代表的值。
如果需要在双引号表示的变量中输出变量名,即 $youStr="your want to display the $myStr" 你不想让变量 $youStr 中的 $myStr 发生替换,则需要在变量名之前添加英文符号倒引号"`"进行转义,在英文输入状态下,这个键位于"Esc"键的下面,注意下面命令的输出内容。
PS C:\WINDOWS\system32> $myStr="this is string variables"
PS C:\WINDOWS\system32> $youStr="your want to display the `$myStr"
PS C:\WINDOWS\system32> $youStr
your want to display the $myStr
变量的保存
用户创建的变量只在当前会话中可用,关闭会话(当前命令窗口)变量将丢失。如果需要保存变量,就需要将其保存在配置文件中,配置文件中的变量将在命令窗口打开时自动加载,将会添加所有的会话中。
可以在命令行输入 $profile 来查看配置文件的路径。
例如,如果需要修改 $VerbosePreference 变量的值为 "Continue" (默认是"SilentlyContinue"),可以再命令行输入 $profile 找到配置文件的路径,通过Notepad等文本编辑器进行修改,或是利用 Add-Content 进行修改。
包含特殊字符的变量名称
如果变量中包含特殊字符,可以使用大括号{} 强制Powershell按字面解释变量名称,如果要定义或是引用包含特殊字符(如短划线,句点,冒号,圆括号)的变量,这会非常有用。
PS C:\WINDOWS\system32> ${this is string array}="a","b","c"
PS C:\WINDOWS\system32> ${this is string array}
a
b
c
以上命令定义了的变量名是 ${this is string array}。
如要引用的变量名称包含圆括号,用大括号将变量名称括起来
PS C:\WINDOWS\system32> Get-ChildItem ${env:ProgramFiles(x86)}
Directory: C:\Program Files (x86)
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2021/12/10 18:20 Accenture
d----- 2023/8/24 21:05 Avecto
d----- 2022/4/7 17:41 Blueberry Software
d----- 2023/8/8 9:38 Cisco
d----- 2023/8/14 16:25 Common Files
d----- 2024/1/19 7:20 Google
d----- 2023/11/18 7:33 Internet Explorer
如果要引用变量名称包含大括号,用大括号将变量名称括起来,变量内部的大括号之前添加倒引号"`"字符转义大括号,倒引号是在引文输入状态下,键盘上"Esc"下面的按键,这个类似于上文讲到的如果在双引号中不想对变量名称替换为值时添加的倒引号。
PS C:\WINDOWS\system32> ${this`{value`}is} = 1
PS C:\WINDOWS\system32> ${this`{value`}is}
1
总结
关于变量,需要注意的是,Powershell中的变量可以使用特殊字符,另外Powershell中的变量可以存储任何类型的对象,整数,字符串,数组,哈希表,服务,进程,事件日志等,即可以将任何一条命令的执行结果赋值给一个变量。最后,在定义变量时,不能定义与内置变量名称一样的变量,因为内置变量是只读,不允许用户更改,会在Powershell的内置变量中讲到Powershell中都包含哪些内置变量。