首页 > 其他分享 >第18章 变量:一个存放资料的地方

第18章 变量:一个存放资料的地方

时间:2023-02-04 16:01:28浏览次数:41  
标签:PS 变量 18 computers number SERVER 存放 PowerShell

第18章 变量:一个存放资料的地方

18.2 存储值到变量中

  PowerShell中的所有东西——的确是所有东西,都被认为是一个对象。
  PowerShell允许在一个变量中存储简单的值。你需要定义一个变量,然后使用等号(=),用于赋值操作,接下来是变量所需存储的值。下面是例子。
PS C:\>$var = 'SERVER-R2'
  需要注意的是,美元符($)并不是变量名称的一部分。“$”符号只是告诉Shell接下来的是一个变量名,并且将要赋值给这个变量。
  下面我们看看关于变量及其名称的一些注意事项。

  • 变量名称通常包含字母、数字和下划线。
  • 变量名可以包含空格,但是名字必须被花括号包住。比如${My Variable]},表示一个变量名“My Variable”。
  • 变量不会驻留在Shell会话之间。当关闭Shell时,所有你创建的变量都会被清除。
  • 变量名可以很长——长到你可以不用考虑它到底能有多长。
  • PowerShell用户通常不需要使用前缀来标识变量存放了什么。

  如果需要查询变量的内容,可以使用美元符号加上变量名称,像下面的例子所实现的。PS C:\> $var

18.3 关于引号有趣的技巧

  PowerShell会把所有包在单引号中的东西认为是一个文本字符串。如下面的例子。

PS C:\>$var = 'What does $var contain?'
PS C:\>$var
What does $var contain?

  但是在双引号中又是另外一番情景。看看下面的技巧。

PS C:\> $computername = 'SERVER-R2'
PS C:\> $phrase = "The computer name is $computername"
PS C:\> $phrase
The computer name is SERVER-R2

  这种替代操作仅发生在Shell初次解析字符串时。

PS C:\>$computername = 'SERVER1'
PS C:\>$phrase
The computer name is SERVER-R2

  关于PowerShell双引号的另外一个窍门是转义字符。这个字符是重音符(`)。它消除了任何在转义符之后有特殊意义字符的含义,或在某些情况下增加了字符的特殊意义。
  下面示例展示消除特殊含义的用法。

PS C:\>$computername = 'SERVER-R2'
PS C:\>$phrase = "`$computername contains $computername"
PS C:\>phrase
$computername contains SERVER-R2

  下面来看一个第二种使用重音符的例子。

PS C:\>$phrase = "`$computername`ncontains`n$computername"
PS C:\>$phrase
contains
SERVER-R2

  仔细检查,你会发现我们在语句中使用了两次`n——一个在第一个$computername后,另一个在contains后。
  运行“help about_escape”可以获得更多的信息,它包含了其他关于特殊转义符的列表。

18.4 在一个变量中存储多个对象

  其中一种方式是使用逗号分隔符列表,因为PowerShell认为这些列表是对象的集合。

18.4.1 与多值单一变量的单一对象交互

  你可以在某一时刻访问多值单一变量的独立元素,只需在中括号中指定你要访问的对象的索引号即可。该编号从0开始,第二个值的索引号为1,以引类推。你还可以使用-1这个索引号来访问对象的最后一个值,-2为倒数第二个值,等。比如:
PS C:\>$computers[0]

18.4.2 与多值单一变量的多个对象交互

  PowerShell v2不允许你同时针对多个对象调用一个方法或者访问一个属性。如果你非要尝试,会收到报错信息。
  替代方案是,你必须指定变量中你期望操作的那个对象,然后访问它的属性或执行一个方法。

PS C:\>$computers[0].tolower()
server-r2
PS C:\>$computers[1].replace('SERVER','CLIENT1')
CLIENT1

  再次提醒,这些方法会产生新的字符串结果,而不会更改变量中的原有值。用下面的方式可以测试。

PS C:\>$computers
SERVER-R2
CLIENT1
Localhsot

  如果你希望改变变量中的内容,该怎么办呢?你必须为现有对象赋予新值。

PS C:\>$computers[1] = $computers[1].replace('SERVER','CLIENT')
PS C:\>$computers
SERVER-R2
CLIENT1
Localhost

  从例子中可以看出已修改变量中的第二个对象,而不是产生一个新的字符串。我们在这里提出的这个例子仅在安装了PowerShell v2的电脑上才有效;而这种行为已经在v3中得到改变,我们将会在后面介绍。

18.4.3 与多个对象交互的其他方式

  如果你想要变量中的每个对象都执行ToLower()方法,并把结果存储回去,你可以像这样执行。

PS C:\>$computers = $computers | Foreach-Object { $_.ToLower() }
PS C:\>$computers
server-r2
client1
localhost

  你可以使用“Select-Object”对属性做类似的事。该示例选择传输到该cmdlet每个对象的length属性。
PS C:\>$computers | select-object length

18.4.4 在PowerShell v3中展现属性和方法

  “当一个变量包含多个对象时,不能访问属性和方法”被证明会让PowerShell v1和v2的用户非常困惑。因此,对于v3和后续版本,微软做出重要改变,该变更称之为“automatic unrolling”。它本质上意味着你现在可以访问一个包含多个对象的变量的属性和方法。

$services = Get-service
$services.name

  上面的代码等价与:
Get-service | Foreach-Object { Write-Output $_.Name }
  也等价于:
Get-Service | Select-Object -ExpandProperty Name
  这两种方式是在v1和v2中不得不用的方式,其工作原理也等于:

$objects = Get-WmiObject -class Win32_Service -filter "name='BITS'"
$objects.ChangeStartMode('Disabled')

  记住,这是在PowerShell v3和后续特性中独有的——不要期望这种方式能在旧版中有效。

18.5 双引号的其他技巧

  对于双引号,还有一个很酷的技术可用,这个技巧是对变量替换概念的延伸。假设你把一堆服务存入$service变量。现在你只想把第一个服务名称放入一个字符串。

PS C:\>$services = get-service
PS C:\>$firstname = "$services[0].name"
PS C:\>$firstname

  出错了。例子中紧跟$services的“[”符号不是常规文本字符,会引发PowerShell尝试替换$services。同时因为这种阻塞,字符串中的[0].name部分完全没有被替换。
  解决方法是将上述命令放入一个表达式。

PS C:\>$services = get-service
PS C:\>$firstname = "The first name is $($services[0].name)"
PS C:\>$firstname
The first name is AeLookupSvc

  在$()中的所有内容都会被当成普通的PowerShell命令,结果也被放入字符串中,替代原有的所有内容。同样,该操作仅在双引号中有效。这种$()结构称为子表达式。

18.6 声明变量类型

  比如,假设你有一个变量希望用于存储一个数值,准备用于一些算术运算,并期待用户输入一个数值。请看下面的例子,你可以直接在命令行中输入数值。

PS C:\>$number = Read-Host "Enter a number"
Enter a number: 100
PS C:\>$number = $number * 10
PS C:\>$number
100100100100100100100100100100

  见鬼,为什么100乘以10会得出这样的数字。原来PowerShell并没有把我们的输入当作数值,而是把它当作字符串。PowerShell只是把100这个字符串重复了10次,而不是把100乘以10。
  对于该问题有很多解决方法,我们将介绍其中最简单的一种。
  首先,告诉Shell知道$number变量应该存储一个整型,强制Shell把值转换成一个整型。如下面的例子,通过在变量首次使用前使用[],明确定义一个数据类型“int”实现。

PS C:\>[int]$number = Read-Host "Enter a number"
Enter a number: 100
PS C:\>$number | gm
PS C:\>$number = $number * 10
PS C:\$number
1000

  在前面的例子中,我们使用了[int]强制$number仅包含整数,在你输入以后,我们把$number用管道传输到Gm,验证它的确已经是整型而不是字符串。最后我们可以看到,变量的值被认为是数值型并进行了实际乘法运算。
  使用该技术的另外一个优势是,在Shell无法把数据的值转换成数字时,使得Shell可以抛出错误,因为$number仅仅是存储数值的一个容器。
  除了一个防止后续问题的例子,因为你可以确保$number能存储你希望的值。

  • [int]——整型数字
  • [single]和[double]——单精度和多精度浮点型数值
  • [string]——字符串
  • [char]——仅单个字符
  • [xml]——一个XML文档。
  • [adsi]——一个活动目录服务接口(ADSI)查询。

18.8 针对变量的最佳实践

  虽然我们前面已经提到过绝大部分的最佳实践,但是还是有必要做一个快速回顾。

  • 确保变量名有意义,但也要简洁。
  • 不要在变量中使用空格。
  • 如果变量仅包含一类对象,那么在你首次使用变量前时,请定义对象类型。

标签:PS,变量,18,computers,number,SERVER,存放,PowerShell
From: https://www.cnblogs.com/evan-whc/p/17091699.html

相关文章