В PowerShell, как и в любом другом языке программирования есть переменные. В этой статье разберём особенности переменных в PowerShell, например все переменные это объекты и переменные имеют динамический тип. Для более подробной информации обратитесь к документации.
PowerShell переменные и их особенности
Переменные в PowerSHell, как и всё остальное — это объекты. Эту особенность тоже разберём в этой статье, но чуть ниже. Другой особенностью переменных PowerShell является то, что тип переменной зависит от её значения, например:
$foo = 1
— число;$foo = 'one'
— строка;$foo = $true
— логическая переменная.
Стоит усвоить что типы переменных в PowerShell — динамические, то есть зависят от значения переменной.
Все переменные начинаются со знака доллара ($). Если не указать знак доллара, то PowerShell подумает что вы вызываете Командлет а не Переменную. Чтобы вывести значение переменной нужно просто написать её название, а чтобы присвоить ей значение нужно использовать знак равно (=). Вот пример:
> $a = 5 > $a 5
В PowerSHell есть пользовательские и встроенные переменные. Выше в примере мы создали пользовательскую переменную a и присвоили ей значение 5. Встроенные переменные обычно настраивают работу самого PowerShell или показывают какую-то информацию. Некоторые встроенные переменные можно изменять, но есть те, которые изменять нельзя.
Пользовательские переменные
Присваивать значение переменной можно не только с помощью знака равенства, а ещё с помощью командлета Set-Variable. А смотреть на переменную можно с помощью Get-Variable. Например так:
> Set-Variable -Name a -Value 15 > Get-Variable -Name a Name Value ---- ----- a 15
Если командлету Get-Variable не указать имя переменной, то будут выведены все встроенные и пользовательские переменные и их значения.
PS C:\Windows\system32> Get-Variable Name Value ---- ----- $ a ? True ^ Get-Variable a 15 args {} ConfirmPreference High ###вывод сократил###
Встроенные переменные
Встроенные переменные обычно не меняют, а используют для просмотра какой-то информации о системе. Сейчас рассмотрим некоторые из встроенных переменных PowerShell.
$null
Эта переменная ничего не возвращает. Может использоваться для создания переменной, без присвоения ей значения:
> $b = $null > Get-Variable -Name b Name Value ---- ----- b > Get-Variable -Name null Name Value ---- ----- null
$lastexitcode
Когда внешнее приложение, например ping.exe, завершает работу, оно заканчивается с кодом выхода. Этот код выхода приложения заносится в переменную $lastexitcode. Если код выхода равен нулю, значит программа выполнилась успешно, в противном случае код завершения может быть другим. Вот пример с утилитой ping:
> ping ya.ru Обмен пакетами с ya.ru [87.250.250.242] с 32 байтами данных: Ответ от 87.250.250.242: число байт=32 время=15мс TTL=55 Ответ от 87.250.250.242: число байт=32 время=15мс TTL=55 Ответ от 87.250.250.242: число байт=32 время=15мс TTL=55 Ответ от 87.250.250.242: число байт=32 время=15мс TTL=55 Статистика Ping для 87.250.250.242: Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь) Приблизительное время приема-передачи в мс: Минимальное = 15мсек, Максимальное = 15 мсек, Среднее = 15 мсек > $LASTEXITCODE 0 > ping qwerasdf.opt При проверке связи не удалось обнаружить узел qwerasdf.opt. Проверьте имя узла и повторите попытку. > $LASTEXITCODE 1
В переменную $lastexitcode записывается код выхода последнего приложения. Поэтому при завершении другого приложения её значение может измениться.
$true и $false
Переменная $true всегда содержит значение true логического типа данных. Тоже самое относится и к переменной $false — содержит false логического типа.
$MaximumHistoryCount
В переменной $MaximumHistoryCount содержится максимальное число строк для хранения истории команд. Значение этой переменной можно менять, а по умолчанию оно равно 4096.
> $MaximumHistoryCount 4096 > $MaximumHistoryCount = 200 > $MaximumHistoryCount 200
$^
В переменной $^ хранится имя последней команды, например:
> ping -n 1 8.8.8.8 Обмен пакетами с 8.8.8.8 по с 32 байтами данных: Ответ от 8.8.8.8: число байт=32 время=23мс TTL=110 Статистика Ping для 8.8.8.8: Пакетов: отправлено = 1, получено = 1, потеряно = 0 (0% потерь) Приблизительное время приема-передачи в мс: Минимальное = 23мсек, Максимальное = 23 мсек, Среднее = 23 мсек > $^ ping
Типы переменных
Тип Bool — логический тип переменной, который может содержать либо true, либо false.
Тип Int32 — 32 разрядное число со знаком, то есть число из диапазона от -2147483648 до +2147483647. Если в этот диапазон вы не укладываетесь, то можно использовать тип Int64, который имеет диапазон намного больше от –9223372036854775808 до 9223372036854775807.
Тип Double — числа с плавающей точкой. Другой тип для чисел с плавающей точно — это Float. В подробности этих типов я вдаваться не буду, просто запомните что их можно применять для десятичных чисел и что они могут быть не точными.
Для строк есть тип String. Строки всегда заключаются в одинарные или двойные кавычки. При отсутствие кавычек PowerShell поймет строку как Командлет и выдаст ошибку, вот пример:
> $color = blue blue : Имя "blue" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку. строка:1 знак:10 + $color = blue + ~~~~ + CategoryInfo : ObjectNotFound: (blue:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
Просмотр типа переменной
Так как переменные это объекты, то у них есть некоторые методы. Метод GetType() возвращает тип переменной и некоторую дополнительную информацию. А есть указать GetType().Name — то в выводе будет только тип переменной. Вот пример:
> $a=5 > $b=5.25 > $color='blue' > $a.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Int32 System.ValueType > $b.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Double System.ValueType > $color.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object > $color.GetType().Name String
Вставка в строку переменной
В строку можно вставить значение переменной, для этого нужно использовать двойные кавычки вместо одинарных. Вот пример:
> $name='alex' > $hello='Hello $name' > $hello Hello $name > $hello="Hello $name" > $hello Hello alex
Переменные это объекты
Так как переменная это объект, то мы можем посмотреть на все свойства объекта. Это делается с помощью командлета Select-Object таким образом:
> Select-Object -InputObject $color -Property * Length ------ 4
В место звездочки, в примере выше, вы можете написать название свойства, а звёздочка означает что нужно вывести все свойства этого объекта.
Строка имеет только одно свойство — Lenght, это длина строки. Так как переменная $color содержит значение blue, то длина строки равняется 4.
Использовать атрибуты (свойства) объекта можно таким образом:
> $color.Length 4
Чтобы посмотреть методы объекта применяется другой командлет — Get-Member. Применяется он таким образом:
> Get-Member -InputObject $color TypeName: System.String Name MemberType Definition ---- ---------- ---------- Clone Method System.Object Clone(), System.Object ICloneable.Clone() CompareTo Method int CompareTo(System.Object value), int CompareTo(string strB), int IComparab... Contains Method bool Contains(string value) CopyTo Method void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int co... EndsWith Method bool EndsWith(string value), bool EndsWith(string value, System.StringCompari... Equals Method bool Equals(System.Object obj), bool Equals(string value), bool Equals(string... ### пропустил некоторый вывод### Length Property int Length {get;}
Как видим командлет Get-Member показывает и свойства (атрибуты) объекта и его методы.
Оказывается со строковым объектом связано очень много методов. Количество методов и свойств зависит от его родительского класса.
Вот так можно использовать методы объекта:
> $color.Remove(2) bl > $color.Remove(3) blu > $color blue
Метод Remove() перед выводом удаляет из строки всё начиная с номера указанного символа. В примере выше мы вначале удалили всё начиная со 2-ого символа, затем всё начиная с 3-его, затем убедились что значение в переменной не поменялось. Кстати, в строке отсчет символов начинается с нуля.