什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

从历史上看,Unix 系统上的命令行实用程序比 Windows 上的开发得更好,但随着新解决方案的出现,情况发生了变化。

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

PowerShell 可以用解释型多范式语言编写脚本,该语言具有经典过程、面向对象甚至函数式编程的元素:条件分支、循环、变量、数组、哈希表、类、错误处理以及函数, cmdlet 和管道。 上一篇文章 致力于在该环境中工作的基础知识,现在我们为读者提供程序员的小指南。

目录:

评论
变量及其类型
系统变量
范围
环境变量(环境)
算术和比较运算符
赋值运算符
逻辑运算符
条件跳转
周期
阵列
哈希表
功能
错误处理

您可以在任何文本编辑器中或使用集成开发环境编写代码 - 最简单的方法是使用 Microsoft 服务器操作系统附带的 Windows PowerShell ISE。 这仅对于相当复杂的脚本是必要的:简短的命令集更容易交互执行。

评论

使用注释以及适当的缩进和空格被认为是良好编程风格的一部分:

# Для строчных комментариев используется символ решетки — содержимое строки интерпретатор не обрабатывает.

<# 

       Так обозначаются начало и конец блочного комментария. 
       Заключенный между ними текст интерпретатор игнорирует.

#>

变量及其类型

PowerShell 中的变量是命名对象。 它们的名称可以包含下划线字符以及字母和数字。 $ 符号总是在名称之前使用,并且要声明一个变量,给解释器一个有效的名称就足够了:

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

要初始化变量(为其赋值),请使用赋值运算符(符号 =):

$test = 100

您可以通过在名称或值之前的方括号(类型转换运算符)中指定变量的类型来声明变量:

[int]$test = 100

$test = [int]100

重要的是要了解 PowerShell 中的变量是成熟的对象(类),其属性和方法的类型基于 .NET Core 中的类型。 我们列出主要的:

类型(.NET 类)

使用说明

代码示例

[字符串] 系统.字符串

统一码字符串 

$测试=“测试”
$测试 = '测试'

[char]系统.Char

Unicode 字符(16 位)

[字符]$测试 = 'c'

[布尔] 系统布尔值

布尔类型(布尔 True 或 False)

[布尔]$测试=$true

[int] 系统.Int32

三十二位整数(32 位)

[int]$测试 = 123456789

[长] System.Int64

六十四位整数(64位)

[长]$测试 = 12345678910

[单一] 系统.单一

浮点数 32 位长

[单个]$测试 = 12345.6789

[双]系统.双

长度为 64 位(8 字节)的浮点数

[双]$测试= 123456789.101112

[十进制]System.Decimal

128位浮点数(要求以d结尾)

[十进制]$test = 12345.6789d

[日期时间]系统.日期时间

日期和时间 

$测试=获取日期

[数组] 系统对象[]

元素索引从 0 开始的数组

$test_array = 1, 2, "测试", 3, 4

[哈希表] System.Collections.Hashtable

哈希表是具有命名键的关联数组,根据以下原则构建:@{key = "value"}

$test_hashtable = @{one="one"; 两个=“二”; 三=“三”}

PowerShell支持隐式类型转换,此外,可以动态更改变量的类型(例如,使用赋值运算符),如果不强制指定 - 在这种情况下,解释器将给出错误。 您可以通过调用 GetType() 方法来确定上一个示例中变量的类型:

$test.GetType().FullName

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

有许多用于操作变量的 cmdlet。 使用以下命令以方便的形式显示它们的列表:

Get-Command -Noun Variable | ft -Property Name, Definition -AutoSize -Wrap

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

要查看声明的变量及其值,您可以使用特殊的 cmdlet:

Get-Variable | more

这种方法看起来过于麻烦,通过运算符或直接访问变量的属性和方法来处理变量要方便得多。 但是,cmdlet 有存在的权利,因为它们允许您设置一些附加参数。 重要的是要了解用户变量仅在当前会话中定义。 当控制台关闭或脚本结束时,它们将被删除。

系统变量

除了用户声明的变量之外,还有一些内置(系统)变量在当前会话结束后不会被删除。 它们分为两种类型,而PowerShell状态数据存储在自动变量中,不能自行为其分配任意值。 例如,这些包括 $PWD:

$PWD.Path

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

需要偏好变量来存储用户偏好,其值是可以改变的。 例如,使用 $ErrorActionPreference ,设置命令解释器对发生非致命错误的反应。

除了用于访问声明的变量的运算符和 cmdlet 之外,还有一个变量:伪累加器。 您可以通过与其他驱动器类比来使用它,这种情况下的变量类似于文件系统对象:

Get-ChildItem Variable: | more

или

ls Variable: | more

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

范围

对于PowerShell中的变量,有作用域(Scope)的概念。 全局作用域(Global)的操作适用于整个当前会话——它包括例如系统变量。 局部(Local)变量仅在定义它们的范围内可用:比如在函数内部。 还有脚本(Script)作用域的概念,但对于脚本命令来说,本质上是本地的。 默认情况下,在声明变量时,它们被赋予局部作用域,要更改它,您需要一个特殊的构造,例如:$Global:variable=value。

例如,这个:

$Global:test = 100

环境变量(环境)

另一个伪驱动器 Env: 可从 PowerShell 获得,可用于访问环境变量。 当 shell 启动时,它们是从父进程(即启动当前会话的程序)复制的,通常它们的初始值与控制面板中的值相同。 要查看环境变量,请使用 Get-ChildItem cmdlet 或其别名(aliases):ls 和 dir。

dir Env:

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

这些变量是字节序列(或字符序列,如果您愿意的话),其解释仅取决于使用它们的程序。 *-Variable cmdlet 不适用于环境变量。 要访问它们,您必须使用驱动器前缀:

$env:TEST = "Hello, World!"

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

算术和比较运算符

PowerShell 提供以下算术运算符:+(加法)、-(减法)、*(乘法)、/(除法)和 %(模或模)。 算术表达式的结果按照普遍接受的运算顺序从左到右计算,括号用于对表达式的各个部分进行分组。 运算符之间的空格将被忽略,它们仅用于使其更易于阅读。 + 运算符也可以连接,* 运算符可以重复字符串。 如果您尝试将数字添加到字符串中,它将被转换为字符串。 此外,PowerShell 语言有许多比较运算符,用于检查两个值之间的匹配并返回布尔值 True 或 False:

操作者

使用说明

代码示例

-eq

等于/等于(类似于其他语言中的 = 或 ==)

测试美元 = 100
$测试-eq 123 

- 是

不等于/不等于(类似于<>或!=)

测试美元 = 100
$测试-ne 123   

-gt

大于/更多(模拟 >)

测试美元 = 100
$测试-gt 123

-ge

大于或等于/大于或等于(类似于>=)

测试美元 = 100
$测试-ge 123

-lt

小于/小于(类似于<)

测试美元 = 100
$测试-lt 123  

-这

小于或等于/小于或等于(类似于<=)

测试美元 = 100
$测试-le 123

还有其他类似的运算符,例如,允许您基于通配符比较字符串或使用正则表达式来匹配模式。 我们将在以后的文章中详细介绍它们。 符号 <、> 和 = 不用于比较,因为它们用于其他目的。

赋值运算符

除了最常见的 = 运算符之外,还有其他赋值运算符:+=、-=、*=、/= 和 %=。 他们在赋值之前更改值。 一元运算符 ++ 和 - 增加或减少变量的值,其行为类似 - 它们也适用于赋值运算符。

逻辑运算符

仅比较不足以描述复杂的条件。 您可以使用运算符编写任何逻辑表达式:-and、-or、-xor、-not 和!..它们的工作方式与其他编程语言类似,同时您可以使用括号来指定计算顺序:

("Тест" -eq "Тест") -and (100 -eq 100)

-not (123 -gt 321) 

!(123 -gt 321)

条件跳转

PowerShell 中的分支运算符是标准的:IF(IF…ELSE, IF…ELSEIF…ELSE) 和 SWITCH。 让我们通过示例来看看它们的用法:

[int]$test = 100
if ($test -eq 100) {
      Write-Host "test = 100"
}



[int]$test = 50
if ($test -eq 100) {
       Write-Host "test = 100"
}
else {
      Write-Host "test <> 100"
}



[int]$test = 10
if ($test -eq 100) {
      Write-Host "test = 100"
}
elseif ($test -gt 100) {
      Write-Host "test > 100"
}
else {
       Write-Host "test < 100"
}



[int]$test = 5
switch ($test) {
     0 {Write-Host "test = 0"}
     1 {Write-Host "test = 1"}
     2 {Write-Host "test = 2"}
     3 {Write-Host "test = 3"}
     4 {Write-Host "test = 4"}
     5 {Write-Host "test = 5"}
     default {Write-Host "test > 5 или значение не определено"}
}

周期

PowerShell 有多种循环:WHILE、DO WHILE、DO UNTIL、FOR 和 FOREACH。

如果/只要前提条件为真,则带有前提条件的循环就有效:

[int]$test = 0
while ($test -lt 10) {
      Write-Host $test
      $test = $test + 1
}

带有后置条件的循环将至少运行一次,因为在迭代后会检查条件。 同时,当条件为 true 时,DO WHILE 起作用,而当条件为 false 时,DO UNTIL 起作用:

[int]$test = 0
do {
      Write-Host $test
      $test = $test + 1 
}
while ($test -lt 10)



[int]$test = 0
do {
      Write-Host $test
      $test = $test + 1 
}
until ($test -gt 9)

FOR 循环的迭代次数是预先已知的:

for ([int]$test = 0; $test -lt 10; $test++) {
       Write-Host $test
}

在 FOREACH 循环中,迭代数组或集合(哈希表)的元素:

$test_collection = "item1", "item2", "item3"
foreach ($item in $test_collection)
{
        Write-Host $item
}

阵列

PowerShell 变量不仅存储单个对象(数字、字符串等),还存储多个对象。 最简单的此类变量是数组。 一个数组可以由多个元素组成,也可以由一个元素组成,也可以为空,即不包含任何元素。 它是使用 @() 运算符声明的,我们将在下一篇文章中用到它 - 这对于将其他数组添加到数组(创建多维数组)、将数组作为参数传递给函数以及类似的任务非常重要:

$test_array = @() #создаем пустой массив

当数组初始化时,其值以逗号分隔(特殊运算符 ,)列出:

$test_array = @(1, 2, 3, 4) # создаем массив из четырех элементов 

在大多数情况下,@() 运算符可以省略:

$test_array = 1, 2, 3, 4

在这种情况下,一个元素的数组初始化如下

$test_array = , 1

使用从零开始的整数索引和索引运算符(方括号)访问数组元素:

$test_array[0] = 1

您可以指定多个以逗号分隔的索引,包括。 再次发生的:

$test_array = "один", "два", "три", "четыре"
$test_array[0,1,2,3]
$test_array[1,1,3,3,0]

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

操作者 .. (两个点 - 范围运算符)返回指定上限和下限内的整数数组。 例如,表达式 1..4 输出四个元素的数组 @(1, 2, 3, 4),表达式 8..5 输出数组 @(8, 7, 6, 5)。

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

使用范围运算符,可以初始化一个数组($test_array = 1..4)或获取一个切片(slice),即一个数组中的元素序列以及另一个数组中的索引。 在本例中,负数 -1 表示数组的最后一个元素,-2 - 倒数第二个元素,依此类推。

$test_array = "один", "два", "три", "четыре"
$test_array[0..2]
$test_array[2..0]
$test_array[-1..0]
$test_array[-2..1]

请注意,整数数组值可以大于数据数组的最大索引值。 在这种情况下,所有值都返回到最后一个:

$test_array[0..100]

如果尝试访问单个不存在的数组元素,则返回 $null。

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

在 PowerShell 中,数组可以包含不同类型的元素或强类型的元素:

$test_array = 1, 2, "тест", 3, 4
for ([int]$i = 0; $i -lt $test_array.count; $i++)
{
          Write-Host $test_array[$i]
}

其中 $test_array.count 属性是数组元素的数量。

创建强类型数组的示例:

[int[]]$test_array = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

哈希表

PowerShell 语言中另一种基本类型的变量是哈希表,也称为关联数组。 哈希表类似于 JSON 对象,并且基于键值构建。 与普通数组不同,它们的元素是通过命名键访问的,这些键是对象的属性(您也可以使用索引运算符 - 方括号)。

使用 @ 符号和运算符括号声明一个空哈希表:

$test_hashtable = @{}

声明时,可以立即创建键并为其赋值:

$test_hashtable = @{one="один"; two="два"; three="три"; "some key"="some value"}

要将一个元素添加到哈希表中,必须为其分配一个尚不存在的键,或者使用 Add() 方法。 如果对现有键进行分配,则其值将会更改。 Remove() 方法用于从哈希表中删除元素。

$test_hashtable."some key"
$test_hashtable["some key"]
$test_hashtable.Add("four", "четыре")
$test_hashtable.five = "пять"
$test_hashtable['five'] = "заменяем значение"
$test_hashtable.Remove("one")

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

这种类型的变量可以作为参数传递给函数和 cmdlet - 在下一篇文章中,我们将研究如何完成此操作,并考虑另一种类似的类型 - PSCustomObject。

功能

PowerShell 拥有过程编程所需的一切,包括函数。 为了描述它们,使用功能词 Function,之后您需要指定函数的名称和括在运算符括号中的函数体。 如果需要向函数传递参数,可以在名称后面的括号中立即指定它们。

function имя-функции (аргумент1, ..., аргументN) 
{ 
        тело-функции 
} 

该函数始终返回一个结果 - 如果有多个语句,它是所有语句结果的数组。 如果只有一条语句,则返回对应类型的唯一值。 return $value 构造将值为 $value 的元素添加到结果数组中并中止语句列表的执行,空函数返回 $null。

例如,让我们创建一个用于对数字进行平方的函数:

function sqr ($number)
{
      return $number * $number
}

请注意,在函数体内,您可以使用在调用它之前声明的任何变量,并且在 PowerShell 中调用函数可能看起来不寻常:参数(如果有)不包含在括号中并用空格分隔。

sqr 2

左右:

sqr -number 2

由于参数传递方式的原因,函数本身有时需要用括号括起来:

function test_func ($n) {}
test_func -eq $null     # функция не вызывалась
(test_func) -eq $null   # результат выражения — $true

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

描述函数时,可以为参数分配默认值:

function func ($arg = value) {
         #тело функции
}

还有另一种语法用于描述函数参数,此外,可以从管道读取参数 - 所有这些都将在下一篇文章中派上用场,当我们查看导出的模块并创建我们自己的 cmdlet 时。

错误处理

PowerShell 有一个 Try...Catch...Finally 机制来处理异常。 Try 块包含可能发生错误的代码,Catch 块包含其处理程序。 如果没有错误,则不会执行。 无论是否发生错误,Finally 块都会在 Try 块之后执行,并且可以有多个 Catch 块来处理不同类型的异常。 异常本身被写入未声明的默认变量 ($_) 并且可以轻松检索。 在下面的示例中,我们实现了防止输入无效值的保护:

try {

        [int]$test = Read-Host "Введите число"
        100 / $test

} catch {

         Write-Warning "Некорректное число"
         Write-Host $_

}

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

对 PowerShell 语言编程基础知识的回顾到此结束。 在接下来的文章中,我们将更详细地研究如何使用不同类型的变量、集合、正则表达式、创建函数、模块和自定义 cmdlet,以及面向对象的编程。

什么是 Windows PowerShell?它与什么一起使用? 第 2 部分:编程语言简介

来源: habr.com

添加评论