Windows Powershell 变量的幕后管理_PowerShell

在Powershell中创建一个变量,会在后台生成一个PSVariable对象,这个对象不仅包含变量的值,也包含变量的其它信息,例如”只写保护”这样的描述。
如果在Powershell中输出一个变量,只会输出这个变量的值。不能够显示它的其它信息,如果想查看一个变量的其它保留信息,就需要变量的基类PSVariable对象,这个可以通过Get-Variable命令得到,下面的例子演示如何查看一个变量的全部信息。

PS> $a=get-date
PS> Get-Variable a

Name              Value
----              -----
a               2011/12/8 17:52:02

PS> Get-Variable a | fl *

Name    : a
Description :
Value    : 2011/12/8 17:52:02
Visibility : Public
Module   :
ModuleName :
Options   : None
Attributes : {}

修改变量的选项设置
Powershell处理一个变量的PSVariable对象,主要是为了能够更新变量的选项设置。既可以使用命令Set-Variable,也可以在获取PSvariable对象后直接更改。比如更改一个变量的描述:

PS> $str="我是一个变量"
PS> $var=Get-Variable str
PS> $var

Name              Value
----              -----
str              我是一个变量

PS> $var | fl *

Name    : str
Description :
Value    : 我是一个变量
Visibility : Public
Module   :
ModuleName :
Options   : None
Attributes : {}

PS> $var.Description="我知道你是一个变量"
PS> $var | fl *
Name    : str
Description : 我知道你是一个变量
Value    : 我是一个变量
Visibility : Public
Module   :
ModuleName :
Options   : None
Attributes : {}如果你不想多加一个临时变量$var来存储PSVariable,可以使用Powershell子表达式

PS> (Get-Variable str).Description="变量的描述已更改;"
PS> Get-Variable str | Format-Table Name,Description

Name                            Description
----                            -----------
str                             变量的描述已更改;

激活变量的写保护
可以操作一个变量的选项设置 ,比如给一个变量加上写保护,需要将Option设置为“ReadOnly”

PS> $var="mossfly"
PS> Set-Variable var -Option "ReadOnly"
PS> (Get-Variable var).Options
ReadOnly
PS> Set-Variable var -Option "None" -Force
PS> (Get-Variable var).Options
None

变量的选项
变量的选项是一个枚举值,包含:
“None”:默认设置
“ReadOnly”:变量只读,但是可以通过-Force 选项更新。
“Constant”:常量一旦声明,在当前控制台不能更新。
“Private”:只在当前作用域可见,不能贯穿到其它作用域
“AllScope”:全局,可以贯穿于任何作用域

变量的类型规范
每个变量的都有自己的类型,这个具体的类型存放在PsVariable对象的Attributes[System.Management.Automation.PSVariableAttributeCollection]属性,如果这个Attributes为空,可以给这个变量存放任何 类型的数据,Powershell会自己选择合适的类型。一旦这个Attributes属性确定下来,就不能随意存放数据了。例如给$var存放一个整数,属于弱类型,所以Attributes属性为空,这时还可以给它赋值一个字符串。但是如果给$var增加强类型,存放一个整数,再给它赋值一个其它类型,解释器会自动尝试转换,如果不能转换就会抛出异常。这时如果你非得更新$var变量的类型,可以使用 (Get-Variable var).Attributes.Clear(),清空Attributes,这样强类型就又转换成弱类型了。

PS> $var=123
PS> (Get-Variable var).Attributes
PS> $var.GetType().FullName
System.Int32
PS> $var="字符串"
PS> (Get-Variable var).Attributes
PS> $var.GetType().FullName
System.String
PS> [int]$var=123
PS> (Get-Variable var).Attributes

TypeId
------
System.Management.Automation.ArgumentTypeConverterAttribute

PS> $var.GetType().FullName
System.Int32
PS> $var="2012"
PS> $var
2012
PS> $var.GetType().FullName
System.Int32
PS> $var="2012世界末日"
Cannot convert value "2012世界末日" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:5
+ $var <<<< ="2012世界末日"   + CategoryInfo     : MetadataError: (:) [], ArgumentTransformationMetadataException   + FullyQualifiedErrorId : RuntimeException PS> (Get-Variable var).Attributes.Clear()
PS> (Get-Variable var).Attributes
PS> $var="2012世界末日"
PS> $var.GetType().FullName
System.String

验证和检查变量的内容
变量PSVariable对象的Attributes属性能够存储一些附件条件,例如限制变量的长度,这样在变量重新赋值时就会进行验证,下面演示如何限制一个字符串变量的长度为位于2-5之间。

PS> $var="限制变量"
PS> $condition= New-Object System.Management.Automation.ValidateLengthAttribute -ArgumentList 2,5
PS> (Get-Variable var).Attributes.Add($condition)
PS> $var="限制"
PS> $var="射雕英雄传"
PS> $var="看射雕英雄传"
The variable cannot be validated because the value 看射雕英雄传 is not a valid value for the var variable.
At line:1 char:5
+ $var <<<< ="看射雕英雄传"
  + CategoryInfo     : MetadataError: (:) [], ValidationMetadataException
  + FullyQualifiedErrorId : ValidateSetFailure

常用的变量内容验证还有5种,分别为:
ValidateNotNullAttribute:限制变量不能为空
ValidateNotNullOrEmptyAttribute:限制变量不等为空,不能为空字符串,不能为空集合
ValidatePatternAttribute:限制变量要满足制定的正则表达式
ValidateRangeAttribute:限制变量的取值范围
ValidateSetAttribute:限制变量的取值集合

ValidateNotNullAttribute 例子

PS> $a=123
PS> $con=New-Object System.Management.Automation.ValidateNotNullAttribute
PS> (Get-Variable a).Attributes.Add($con)
PS> $a=8964
PS> $a=$null

无法验证此变量,因为值  不是变量 a 的有效值。
所在位置 行:1 字符: 3

+ $a <<<< =$null
  + CategoryInfo     : MetadataError: (:) [], ValidationMetadataException
  + FullyQualifiedErrorId : ValidateSetFailure
ValidateNotNullOrEmptyAttribute 

例子,注意@()为一个空数组。

PS> $con=New-Object System.Management.Automation.ValidateNotNullOrEmptyAttribute
PS> (Get-Variable a).Attributes.clear()
PS> (Get-Variable a).Attributes.add($con)
PS> $a=$null
The variable cannot be validated because the value is not a valid value for the a variable.
At line:1 char:3
+ $a <<<< =$null   + CategoryInfo     : MetadataError: (:) [], ValidationMetadataException   + FullyQualifiedErrorId : ValidateSetFailure PS> $a=""
The variable cannot be validated because the value is not a valid value for the a variable.
At line:1 char:3
+ $a <<<< =""   + CategoryInfo     : MetadataError: (:) [], ValidationMetadataException   + FullyQualifiedErrorId : ValidateSetFailure PS> $a=@()
The variable cannot be validated because the value System.Object[] is not a valid value for the a variable.
At line:1 char:3
+ $a <<<< =@()
  + CategoryInfo     : MetadataError: (:) [], ValidationMetadataException
  + FullyQualifiedErrorId : ValidateSetFailureValidatePatternAttribute 例子,验证Email格式

PS> $email="test@mossfly.com"
PS> $con=New-Object System.Management.Automation.ValidatePatternAttribute "b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b"
PS> (Get-Variable email).Attributes.Add($con)
PS> $email="abc@abc.com"
PS> $email="abc@mossfly.com"
PS> $email="author@gmail.com"
PS> $email="www@mossfly"
The variable cannot be validated because the value www@mossfly is not a valid value for the email variable.
At line:1 char:7
+ $email <<<< ="www@mossfly"
  + CategoryInfo     : MetadataError: (:) [], ValidationMetadataException
  + FullyQualifiedErrorId : ValidateSetFailureValidateRangeAttribute 例子,验证月份1-12

PS> $month=1
PS> (Get-Variable month).Attributes.Add( $( New-Object System.Management.Automation.ValidateRangeAttribute -ArgumentList 1,12) )
PS> $month=10
PS> $month=12
PS> $month=18
The variable cannot be validated because the value 18 is not a valid value for the month variable.
At line:1 char:7
+ $month <<<< =18   + CategoryInfo     : MetadataError: (:) [], ValidationMetadataException   + FullyQualifiedErrorId : ValidateSetFailure ValidateSetAttribute 例子,验证性别 PS> $sex="男"
PS> $con=New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList "男","女","保密"
PS> (Get-Variable sex).Attributes.Add($con)
PS> $sex="女"
PS> $sex="不男不女"
The variable cannot be validated because the value 不男不女 is not a valid value for the sex variable.
At line:1 char:5
+ $sex <<<< ="不男不女"
  + CategoryInfo     : MetadataError: (:) [], ValidationMetadataException
  + FullyQualifiedErrorId : ValidateSetFailure

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索windows
, powershell
变量的幕后管理
powershell 环境变量、powershell 变量、powershell 打印变量、powershell定义变量、powershell全局变量,以便于您获取更多的相关知识。

时间: 2024-09-30 01:43:25

Windows Powershell 变量的幕后管理_PowerShell的相关文章

Windows Powershell 变量的作用域_PowerShell

如果我们对变量不做特别的声明,Powershell解释器会自动处理和限制变量的作用域.将下面的内容命令保存着至test1.ps1 $windows = $env:windir "Windows Folder: $windows" 然后在控制台给变量$windows赋值,并调用Test.ps1脚本. PS> $windows="Hellow" PS> .\test.ps1 Windows Folder: C:\Windows PS> $windows

Windows Powershell 变量的类型和强类型_PowerShell

变量可以自动存储任何Powershell能够识别的类型信息,可以通过$variable的GetType().Name查看和验证Powershell分配给变量的数据类型. PS> (10).gettype().name Int32 PS> (9999999999999999).gettype().name Int64 PS> (3.14).gettype().name Double PS> (3.14d).gettype().name Decimal PS> ("WW

Windows Powershell使用哈希表_PowerShell

哈希表存放的是对,在哈希表中不再仅仅限制使用数字寻址,可以使用任意类型的数据类型寻址. 创建哈希表 之前使用@()创建数组,现在使用@{}创建哈希表,使用哈希表的键访问对应的值. PS C:Powershell> $stu=@{ Name = "小明";Age="12";sex="男" } PS C:Powershell> $stu Name Value ---- ----- Name 小明 Age 12 sex 男 PS C:Pow

Windows Powershell 通过函数扩展别名_PowerShell

在Powershell中设置别名的确方便快捷,但是在设置别名的过程中并设置参数的相关信息.尽管别名会自动识别参数,但是如何把经常使用的参数默认设定在别名里面呢?例如Test-Connection -Count 2 -ComputerName,让-"-Count 2″ 固化在别名中. 这时简单的别名无法完成上述需求,可以通过函数来完成它,并且一旦把函数拉过来,定义别名会变得更加灵活. PS C:\PS> function test-conn { Test-Connection -Count

Windows Powershell 执行文件和脚本_PowerShell

象运行可执行文件一样,Powershell运行文件和脚本,也必须使用绝对路径或者相对路径,或者要运行的文件必须定义在可受信任的环境变量中. 关于脚本 脚本和批处理都属于伪可执行文件,它们只是包含了若干命令行解释器能够解释和执行的命令行代码. 执行批处理文件 批处理是扩展名为".bat"的文本文件,它可以包含任何cmd控制台能够处理的命令.当批处理文件被打开,Cmd控制台会逐行执行每条命令.那Powershell能够直接执行批处理吗? 将下列命令保存为ping.bat @echo off

Windows Powershell对象转换成文本_PowerShell

Out-Default可以将对象转换成可视的文本.事实上Out-Default会首先调用Format-Table,将更多的属性默认隐藏.再调用Out-Host将结果输出在控制台上.因此下面的三组命令执行结果是相同的. ls ls | Format-Table | Out-Host ls | Out-Default 显示隐藏的对象属性 要查看对象结果的所有属性,可是使用 ls | Format-Table * 这样因为属性和属性的内容太多可能不会显示完全,可以使用文本换行参数 ls | Forma

测试运行: 使用Windows PowerShell实现Web UI自动化

Windows PowerShellTM 是一种新型 Microsoft 命令外壳和脚本语言,可用作多种轻型测试自动化的平台.在本月的"测试运行"专栏中,我将向您展示如何使用 Windows PowerShell 通过自动化 Internet Explorer 为所有类型的 Web 应用程序创建快捷简便的 UI 测试自动化.本专栏主要针对初学者,但是经验丰富的工程师也能在此找到一些感兴趣的信息. 开始前,请确保已将要测试的站点添加到 Internet Explorer 中的"

Windows Powershell 定义变量_PowerShell

变量可以临时保存数据,因此可以把数据保存在变量中,以便进一步操作. #定义变量 $a=10 $b=4 #计算变量 $result=$a*$b $msg="保存文本" #输出变量 $result $msg 40 保存文本 powershell 不需要显示地去声明,可以自动创建变量,只须记住变量的前缀为$. 创建好了变量后,可以通过变量名输出变量,也可以把变量名存在字符串中.但是有个例外单引号中的字符串不会识别和处理变量名. 选择变量名 在powershell中变量名均是以美元符"

Windows Powershell 自动化变量_PowerShell

Powershell 自动化变量 是那些一旦打开Powershell就会自动加载的变量. 这些变量一般存放的内容包括 用户信息:例如用户的根目录$home 配置信息:例如powershell控制台的大小,颜色,背景等. 运行时信息:例如一个函数由谁调用,一个脚本运行的目录等. PS> $HOME C:\Users\test PS> $currentProcessID=$pid PS> $currentProcessID 5356 PS> Get-Process -Id $pid H