Powershell тип переменной: Jump Start в PowerShell (часть II) / Хабр
Содержание
Jump Start в PowerShell (часть II) / Хабр
Кто, если не ты? Когда, если не сейчас?
В предыдущей части мы научились запускать PowerShell, разобрались с политикой выполнения сценариев. Поняли, что такое командлеты, знаем, как передавать их по конвейеру и как получить их свойства. Узнали, что PowerShell имеет огромный Help.
В этой части мы разберёмся с переменными, узнаем, что они за типы и как к ним обращаться, как их сравнивать и выводить всевозможными способами. Обязательно разберёмся с циклами и напишем несколько функций.
← Перейти к I части
Введение
Начать я хочу с ответов на вопросы, возникшие в первом нашем с Вами Jump Start’е:
В чём огромные возможности PowerShell? Зачем мне его изучать?
Каждый под фразой «огромные возможности» может понимать что-то своё.
Если бы мне пришлось охарактеризовать PowerShell в трёх словах, я бы сказал: это среда упрощающая администрирование, помогающая создать инструменты для автоматизации и управления.
Изучить PowerShell точно стоит, если ты администрируешь Windows Server и серверное ПО от Microsoft. Возьмём, к примеру, один из популярнейших продуктов Microsoft Exchange Server — и тут же натыкаешься на PowerShell консоль Exchange Management Shell.
Зная PoSh ты без труда сможешь сделать любую нужную выгрузку данных, настроить контроль за любыми процессами системы, отправлять отчёты, создавать пользователей, решать их проблемы…
Я не занимаюсь администрированием, что тогда?
Это можно сравнить с тем, как люди совершенно разных профессий увлекаются созданием web-сайтов. Вроде им это очень и не надо, но они этим занимаются. Ради собственного развития, развлечения или удовольствия.
Вы студент? Напишите себе своё первое приложение, которое будет решать квадратное уравнение.
Или, например, изучите парсинг и сделайте своё приложение для скачивания музыки или красивых видео из youtube.
Всё зависит от тебя и твоей фантазии. Посмотрите сюда, PowerShell можно даже научить разговаривать.
Можно же просто посмотреть видео на MVA!
Да, я совершенно согласен с Вами — это может быть эффективнее.
Правда, не каждый имеет время на просмотр 12-15 часового курса и не каждый может так воспринимать информацию.
Здесь я пробую дать базовые знания с которыми можно будет успешно продолжить развивать свои умения безгранично дальше.
Переменные
- Переменная в PowerShell начинается со знака $
(в Евросоюзе со знака €)и в названии может содержать любые буквы, цифры и символ подчёркивания. - Чтобы назначить переменной значение, достаточно его ей присвоить знаком «=«. Чтобы вывести значение переменной, можно просто написать эту переменную. Вывод информации мы разберём по тексту ниже.
$var = 619 $var
- Над числами можно производить арифметические операции, строки можно складывать. Если к строке прибавить число, число автоматически преобразуется в строку.
$a = 1 $b = 2 $c = $a + $b $c #c = 3 $str = "Хабра" $str = $str + "хабр" $str #str = Хабрахабр $str = $str + 2014 $str #str = Хабрахабр2014
- Если нам надо узнать, какой тип имеет та или иная переменная, можно воспользоваться методом GetType()
$s = "Это строка?" $s.GetType().FullName
- Тип переменной PowerShell определяет автоматически или его можно назначить вручную.
$var = "one" [string]$var = "one"
PowerShell использует типы данных Microsoft .NET Framework. Рассмотрим основные:
Тип / .NET класс Описание [string] System.String
Строка $var = "one"
[char] System.Char
Символ $var = [char]0x263b
[bool] System.Boolean
Булево. Может иметь значение $true или $false. $bvar = $true
[int] System.Int32
32-разрядное целое число $i = 123456789
[long] System.Int64
64-разрядное целое число $long_var = 12345678910
[decimal] System.Decimal
128 битное десятичное число. Буква d на конце числа обязательна $dec_var = 12345.6789d
[double] System.Double
8-байтное десятичное число с плавающей точкой [double]$double_var = 12345.6789
[single] System.Single
32 битное число с плавающей точкой [single]$var = 123456789.101112
[DateTime] System.DateTime
Переменная даты и времени. $dt_var = Get-Date
[array] System.Object[]
Массив. Индекс элементов массива начинается с 0 — чтобы обратиться к первому элементу массива $mas, следует написать $mas[0]. $mas = "one", "two", "three";
Для добавления элемента к массиву, можно записать
$mas = $mas + "four"
Каждый элемент массива может иметь свой тип
$mas[4] = 1
[hashtable] System.Collections.Hashtable
Хеш-таблицы. Различие между хэш-таблицами и массивами в том, что в массивах используются индексы, а в хэш-таблице именованные ключи. Хеш-таблицы строятся по принципу: @{ ключ = «значение» } $ht = @{odin="one"; dva="two"; tri="three"}
Чтобы добавить элемент к хеш-таблице, можно или присвоить ей тот ключ, которого ещё нет, или воспользоваться методом Add(). Если присваивание делать к существующему ключу — значение ключа изменится на присваиваемое. Для удаления элемента из хеш-таблицы есть метод Remove().
$ht.Add("chetyre", "four") $ht. pyat = "five" $ht.Remove("dva")
Вы наверняка уже поняли, что в переменную можно записать не только какое-то определённое значение и заметили в таблице класс System.Object[]. В переменную так же можно записать вывод любого командлета.
Разберём боевую задачку: требуется узнать IP-адрес и MAC-адрес нескольких компьютеров в сети. Имена компьютеров domain-comp1, domain-comp2. Вариант решения под спойлером:
Показать код
$MAC = Get-WmiObject -ComputerName domain-comp1, domain-comp2 -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=True | Select-Object -Property * | SELECT PSComputerName, @{Name="IPAddress";Expression={$_.IPAddress.get(0)}}, MACAddress, Description $MAC
Что происходит:
Мы записываем в переменную $MAC результат от выполнение командлета Get-WmiObject, с помощью которого передаём WMI запрос на компьютеры, указанные в параметре -computername и возвращаем нужную нам информацию из класса Win32_NetworkAdapterConfiguration.
Обратите внимание, если надо получить IP-адрес и MAC-адрес текущего компьютера, то вместо имён компьютеров, параметру -computername мы передадим точку. И, давайте, в следующим примере сохраним результат в файл D:\comp_mac_ip.csv:
$MAC = Get-WmiObject -ComputerName . -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=True | Select-Object -Property * | SELECT PSComputerName, @{Name="IPAddress";Expression={$_.IPAddress.get(0)}}, MACAddress, Description $MAC | Export-Csv D:comp_ip_mac.csv -Encoding UTF8
Область действия переменных
Область действия переменной в PowerShell может быть либо локальной, либо глобальной. По умолчанию переменная имеет локальную область действия и ограничена областью действия, например, доступна только в функции или только в текущем сценарии. Глобальная переменная действует во всём текущем сеансе PowerShell. Для того, чтобы обозначить глобальную переменную, достаточно написать следующую конструкцию: $Global: переменная = значение
$Global:var = 12
И ещё фишка по теме переменных… Как-то, обсуждая с коллегой 1С и его русскоязычную среду программирования, задались вопросом:
— Интересно, а если в PowerShell задать функцию или переменную на русском языке, она будет работать?
— По идее должно работать, это же тоже символы.
И да, действительно:
function привет() { "Привет, $env:USERNAME. Может не стоит писать на русском?" Start-Sleep 3 "Открыть Хабр?" } function открывай() { & "C:\Program Files\Internet Explorer\iexplore.exe" http://habrahabr.ru/post/242425/ }
Операторы сравнения и логические операторы
Операторы сравнения и логические операторы проверяют равенство или соответствие между двумя значениями.
- При выполнении условия, конструкция сравнения всегда возвращает логическое значение $true или $false, если условие ложь.
В таблице ниже приведены операторы сравнения:
Оператор | Описание | Пример |
---|---|---|
-eq | Equal / Равно (=) | $var = "619" $var -eq 123 #$false |
-ne | Not equal / Не равно (<>) | $var = "619" $var -ne 123 #$true |
-gt | Greater than / Больше (>) | $var = "619" $var -gt 123 #$true |
-ge | Greater than or equal / Больше или равно (>=) | $var = "619" $var -ge 123 #$true |
-lt | Less than / Меньше (<) | $var = "619" $var -lt 123 #$false |
-le | Less than or equal / Меньше или равно (<=) | $var = "619" $var -le 123 #$false |
-like | Сравнение с учётом символа подстановки | "Habra" -like "habr*" #true |
-notlike | Сравнение с учётом не соответствия символа подстановки | "Habra" -notlike "habr*" #false |
-contains | Содержит ли значение слева значение справа | 1, 2, 3, 4, 5 -contains 3 #$true |
-notcontains | Если значение слева не содержит значение справа, получим истину | 1, 2, 3, 4, 5 -notcontains 3 #$false |
-match | Использование регулярных выражений для поиска соответствия образцу | $str = "http://habrahabr. http://(\S+)+(.com)$" #true |
-replace | Заменяет часть или все значение слева от оператора | "Microhabr" -replace "Micro","Habra" #Habrahabr |
Разберём пример. В примере мы формируем путь до возможного профиля пользователя на удалённом компьютере в зависимости от операционной системы. Решение под спойлером:
Показать код
#Путь к профилю на удалённом компьютере Function UProfile ($UCompName, $ULogin) { [string]$CompOS = Get-WmiObject -ComputerName $UCompName -Class Win32_OperatingSystem | SELECT Caption #Получаем заголовок операционной системы компьютера if ($CompOS -match "Windows 7") { #Если в заголовке содержится "Windows 7" [string]$LinkUserProfile = "\\$UCompName\d$\users\$ULogin" #Получаем такой путь $LinkUserProfile } elseif ($CompOS -match "Windows XP") { #Если в заголовке содержится "Windows XP" [string]$LinkUserProfile = "\\$UCompName\d$\Documents and Settings\$ULogin" #Получаем такой путь $LinkUserProfile } } UProfile domain-comp1 Administrator #функция имя-компьютера логин-пользователя
Да, здесь мы не проверяем, существует ли профиль. Но можно и проверить. Для этого добавим ещё одно условие, в котором будем проверять командлетом Test-Path существование пути:
#Путь к профилю на удалённом компьютере Function UProfile ($UCompName, $ULogin) { [string]$CompOS = Get-WmiObject -ComputerName $UCompName -Class Win32_OperatingSystem | SELECT Caption #Получаем заголовок операционной системы компьютера if ($CompOS -match "Windows 7") { #Если в заголовке содержится "Windows 7" [string]$LinkUserProfile = "\\$UCompName\d$\users\$ULogin" #Получаем такой путь } elseif ($CompOS -match "Windows XP") { #Если в заголовке содержится "Windows XP" [string]$LinkUserProfile = "\\$UCompName\d$\Documents and Settings\$ULogin" #Получаем такой путь } if (Test-Path $LinkUserProfile) { $LinkUserProfile } else { "Профиль $ULogin не существует на компьютере $UCompName" } #Проверяем существование профиля } UProfile domain-comp1 Administrator #функция имя-компьютера логин-пользователя
Кстати, регулярные выражение в PowerShell очень хорошо описал Xaegr в своём блоге. Стоит того, чтобы потратить пару часов на прочтение и постичь умение написания regular expressions.
Оператор | Описание | Пример |
---|---|---|
-and | Логическое и | ("Строка" -eq "Строка") -and (619 -eq 619) #$true |
-or | Логическое или | ("Строка" -eq "Строка") -or (619 -eq 123) #$true |
-not | Логическое не | -not (123 -gt 324) #$true или !(123 -gt 324) #$true |
Пара слов про
if… elseif и else
if ( условие1-верно ) { выполняем-код } #если условие 1 верно, выполняем код, если нет - идём дальше elseif ( условие2-верно ) { выполняем-код } #необязательное условие: иначе, если условие 2 верно, выполняем код else { выполняем-код } #необязательное условие: если прошлое условие не верно, выполняем код
Всё совсем просто. Если условие верно, мы выполняем следующий за условием код в фигурных скобках. Если условие не верно, то мы пропускаем выполнение и смотрим, продолжается ли у нас условие дальше.
Если находим elseif — проверяем новое условие и так же, в случае успеха, выполняем код, иначе, снова смотрим, есть ли продолжение в виде elseif или else.
Если условие выполняется, то код выполняется и ветка elseif или else пропускается.
$str = "" if ( 1 -gt 2 ) { $str = "Апельсин" } elseif ( $str -eq "Апельсин" ) { $str } else { $str = "Яблоко"; $str }
Ответ
Вывод информации
Рассмотрим несколько основных вариантов вывода информации на экран:
- Запись в файл, используя Out-File
$str = "Hello Habr!" $str | Out-File D:\out_test1.txt
или, как мы говорили в I части, использовать знак «>«$str = "Hello Habr!" $str > D:\out_test2.txt
- Экспорт данных в . csv файл, используя Export-Csv
$p = Get-Process $p | SELECT Name, Path | Export-Csv -Path D:\out_test3.csv
- Запись в файл HTML, используя ConvertTo-Html
$h = Get-Process $h | ConvertTo-Html -Property Name, Path > D:\out_test4.html & D:\out_test4.html #Откроем файле после формирования
Работать с HTML выводом на самом деле очень приятно. Имея навыки web-программирования можно добавить стилей и на выходе получить очень симпатичные отчёты.
Прочитать файл нам поможет уже знакомый нам командлет Get-Content
Get-Content D:\out_test1.txt
Циклы
Циклы в PowerShell мало чем отличаются от циклов в других языках. Почти всё как и везде:
Do While
Делать до тех пор, пока условие верно
$x = 10 do { $x $x = $x - 1 } while ($x -gt 0)
Do Until
Цикл, который повторяет набор команд, пока выполняется условие
$x = 0 do { $x $x = $x + 1 } until ($x -gt 10)
For
Цикл, который повторяет одинаковые шаги определённое количество раз
for ($i = 0; $i -lt 10; $i++) { $i }
ForEach
Цикл по коллекции объектов
$collection = "Имя-Компьютера1", "Имя-Компьютера2", "Имя-Компьютера3" foreach ($item in $collection) { $item }
Пишем функции
Например, функция для получения квадрата числа, на PowerShell будет выглядеть так:
function sqr ($a) { return $a * $a } sqr 2 #Результат: 4
И на последок, пример функции, которая поможет нам выполнять транслитерацию. В этом примере как раз всё то, что мы сегодня рассматривали:
Показать код
#Транслитерация function Translit ([string]$inString) { $Translit = @{ #Создаём хеш-таблицу соответствия символов [char]'а' = "a" [char]'А' = "A" [char]'б' = "b" [char]'Б' = "B" [char]'в' = "v" [char]'В' = "V" [char]'г' = "g" [char]'Г' = "G" [char]'д' = "d" [char]'Д' = "D" [char]'е' = "e" [char]'Е' = "E" [char]'ё' = "yo" [char]'Ё' = "Yo" [char]'ж' = "zh" [char]'Ж' = "Zh" [char]'з' = "z" [char]'З' = "Z" [char]'и' = "i" [char]'И' = "I" [char]'й' = "j" [char]'Й' = "J" [char]'к' = "k" [char]'К' = "K" [char]'л' = "l" [char]'Л' = "L" [char]'м' = "m" [char]'М' = "M" [char]'н' = "n" [char]'Н' = "N" [char]'о' = "o" [char]'О' = "O" [char]'п' = "p" [char]'П' = "P" [char]'р' = "r" [char]'Р' = "R" [char]'с' = "s" [char]'С' = "S" [char]'т' = "t" [char]'Т' = "T" [char]'у' = "u" [char]'У' = "U" [char]'ф' = "f" [char]'Ф' = "F" [char]'х' = "h" [char]'Х' = "H" [char]'ц' = "c" [char]'Ц' = "C" [char]'ч' = "ch" [char]'Ч' = "Ch" [char]'ш' = "sh" [char]'Ш' = "Sh" [char]'щ' = "sch" [char]'Щ' = "Sch" [char]'ъ' = "" [char]'Ъ' = "" [char]'ы' = "y" [char]'Ы' = "Y" [char]'ь' = "" [char]'Ь' = "" [char]'э' = "e" [char]'Э' = "E" [char]'ю' = "yu" [char]'Ю' = "Yu" [char]'я' = "ya" [char]'Я' = "Ya" } $TranslitText = "" foreach ($CHR in $inCHR = $inString. ToCharArray()) { if ($Translit[$CHR] -cne $Null) { $TranslitText += $Translit[$CHR] } #аналог записи $TranslitText = $TranslitText + $Translit[$CHR] else { $TranslitText += $CHR } } return $TranslitText } Translit Хабрахабр #Вывод: Habrahabr
Послесловие
Теперь мы знаем достаточно информации, чтобы начать погружаться в PowerShell ещё глубже. В этой части мы встретились с переменными, типами данных, разобрались с выводом информации, операторами сравнения, циклами… Посмотрите, ведь начать, оказывается, не так уж и сложно!
Сохраняй спокойствие и учи PowerShell.
Продолжение следует…
Дополнительная информация
- Jump Start в PowerShell (часть I);
- Скачать PowerShell v.5 бесплатно без регистрации;
- Замечательный курс на MVA: Расширенные возможности и написание скриптов в PowerShell 3.0 (Jump Start). Мой совет — посмотрите первые 3 блока, окунитесь в язык, попробуйте повыполнять какие-нибудь задачи и через недельку смотрите оставшиеся блоки. Русские субтитры;
- Видео в тему на TechDays;
Галерея скриптов PowerShell на Technet;
Блог разработчиков PowerShell.
сведения о переменных — PowerShell
-
Статья -
-
Краткое описание
Описывает, как переменные хранят значения, которые можно использовать в PowerShell.
Подробное описание
Все типы значений можно хранить в переменных PowerShell. Например, сохраните результаты команд и сохраните элементы, используемые в командах и выражениях, таких как имена, пути, параметры и значения.
Переменная — это единица памяти, в которой хранятся значения. В PowerShell переменные представлены текстовыми строками, начинающимися с знака доллара ($
), например $a
, $process
или $my_var
.
Имена переменных не чувствительны к регистру и могут включать пробелы и специальные символы. Но имена переменных, включающие специальные символы и пробелы, трудно использовать и следует избегать. Дополнительные сведения см. в разделе «Имена переменных», включающие специальные символы.
В PowerShell существует несколько различных типов переменных.
Созданные пользователем переменные: созданные пользователем переменные создаются и поддерживаются пользователем. По умолчанию переменные, создаваемые в командной строке PowerShell, существуют только во время открытия окна PowerShell. При закрытии окон PowerShell переменные удаляются. Чтобы сохранить переменную, добавьте ее в профиль PowerShell. Вы также можете создавать переменные в сценариях с глобальной областью, скриптом или локальной областью.
Автоматические переменные: автоматические переменные хранят состояние PowerShell. Эти переменные создаются с помощью PowerShell, и PowerShell изменяет их значения в соответствии с требованиями к их точности. Пользователи не могут изменить значение этих переменных. Например,
$PSHOME
переменная сохраняет путь к каталогу установки PowerShell.Дополнительные сведения, список и описание автоматических переменных см. в about_Automatic_Variables.
Переменные предпочтения: переменные предпочтения хранят пользовательские настройки для PowerShell. Эти переменные создаются с помощью PowerShell и заполняются значениями по умолчанию. Пользователи могут изменять значения этих переменных. Например,
$MaximumHistoryCount
переменная определяет максимальное количество записей в журнале сеансов.Дополнительные сведения, список и описание переменных предпочтения см. в about_Preference_Variables.
Работа с переменными
Чтобы создать новую переменную, используйте инструкцию присваивания, чтобы назначить значение переменной. Перед использованием этой переменной не нужно объявлять ее. Значение по умолчанию для всех переменных .$null
Чтобы получить список всех переменных в сеансе PowerShell, введите Get-Variable
. Имена переменных отображаются без предыдущего знака доллара ($
), используемого для ссылки на переменные.
Пример:
$MyVariable = 1, 2, 3 $Path = "C:\Windows\System32"
Переменные полезны для хранения результатов команд.
Пример:
$Processes = Get-Process $Today = (Get-Date).DateTime
Чтобы отобразить значение переменной, введите имя переменной, предшествующее знаку доллара ($
).
Пример:
$MyVariable
1 2 3
$Today
Tuesday, September 3, 2019 09:46:46
Чтобы изменить значение переменной, назначьте новое значение переменной.
В следующих примерах отображается значение переменной $MyVariable
, изменяется значение переменной, а затем отображается новое значение.
$MyVariable = 1, 2, 3 $MyVariable
1 2 3
$MyVariable = "The green cat." $MyVariable
The green cat.
Чтобы удалить значение переменной, используйте Clear-Variable
командлет или измените значение $null
на .
Clear-Variable -Name MyVariable
$MyVariable = $null
Чтобы удалить переменную, используйте Remove-Variable или Remove-Item.
Remove-Variable -Name MyVariable
Remove-Item -Path Variable:\MyVariable
Кроме того, можно назначить значения нескольким переменным с помощью одной инструкции.
В следующих примерах одно и то же значение присваивается нескольким переменным:
$a = $b = $c = 0
В следующем примере несколько значений назначаются нескольким переменным.
$i,$j,$k = 10, "red", $true # $i is 10, $j is "red", $k is True $i,$j = 10, "red", $true # $i is 10, $j is [object[]], Length 2
Дополнительные сведения см. в разделе «Назначение нескольких переменных » about_Assignment_Operators.
Типы переменных
Можно хранить любой тип объекта в переменной, включая целые числа, строки, массивы и хэш-таблицы. Объекты, представляющие процессы, службы, журналы событий и компьютеры.
Переменные PowerShell слабо типизированные, что означает, что они не ограничиваются определенным типом объекта. Одна переменная может даже содержать коллекцию или массив различных типов объектов одновременно.
Тип данных переменной определяется типами .NET значений переменной. Чтобы просмотреть тип объекта переменной, используйте Get-Member.
Пример:
$a = 12 # System.Int32 $a = "Word" # System.String $a = 12, "Word" # array of System.Int32, System.String $a = Get-ChildItem C:\Windows # FileInfo and DirectoryInfo types
Можно использовать атрибут типа и нотацию приведения, чтобы убедиться, что переменная может содержать только определенные типы объектов или объекты, которые можно преобразовать в этот тип. При попытке назначить значение другого типа PowerShell пытается преобразовать значение в его тип. Если тип не удается преобразовать, инструкция присваивания завершается ошибкой.
Чтобы использовать нотацию приведения, введите имя типа, заключенное в квадратные скобки, перед именем переменной (слева от оператора присваивания). В следующем примере создается переменная $number
, которая может содержать только целые числа, переменную, $words
которая может содержать только строки и $dates
переменную, которая может содержать только объекты DateTime .
[int]$number = 8 $number = "12345" # The string is converted to an integer. $number = "Hello"
Cannot convert value "Hello" to type "System.Int32". Error: "Input string was not in a correct format." At line:1 char:1 + $number = "Hello" + ~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException + FullyQualifiedErrorId : RuntimeException
[string]$words = "Hello" $words = 2 # The integer is converted to a string. $words += 10 # The plus (+) sign concatenates the strings. $words
210
[datetime] $dates = "09/12/91" # The string is converted to a DateTime object. $dates
Thursday, September 12, 1991 00:00:00
$dates = 10 # The integer is converted to a DateTime object. $dates
Monday, January 1, 0001 00:00:00
Использование переменных в командах и выражениях
Чтобы использовать переменную в команде или выражении, введите имя переменной перед знаком доллара ($
).
Если имя переменной и знак доллара не заключены в кавычки или если они заключены в двойные кавычки ("
), значение переменной используется в команде или выражении.
Если имя переменной и знак доллара заключены в одинарные кавычки ('
) знак, в выражении используется имя переменной.
Дополнительные сведения об использовании кавычек в PowerShell см. в about_Quoting_Rules.
В этом примере возвращается значение переменной $PROFILE
, которая является путем к файлу профиля пользователя PowerShell в консоли PowerShell.
$PROFILE
C:\Users\User01\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
В этом примере показаны две команды, которые могут открыть профиль PowerShell в notepad. exe. В примере с двойными кавычками ("
) используется значение переменной.
notepad $PROFILE notepad "$PROFILE"
В следующих примерах используются одинарные кавычки ('
), которые обрабатывают переменную как литеральный текст.
'$PROFILE'
$PROFILE
'Use the $PROFILE variable.'
Use the $PROFILE variable.
Имена переменных, включающие специальные символы
Имена переменных начинаются с знака доллара ($
) и могут включать буквенно-цифровые символы и специальные символы. Длина имени переменной ограничена только доступной памятью.
Рекомендуется, чтобы имена переменных включали только буквенно-цифровые символы и символ подчеркивания (_
). Имена переменных, включающие пробелы и другие специальные символы, трудно использовать и следует избегать.
Имена буквенно-цифровых переменных могут содержать следующие символы:
- Символы Юникода из этих категорий: Lu, Ll, Lt, Lm, Lo или Nd.
- Символ подчеркивания (
_
). - Знак вопроса (
?
)
В следующем списке содержатся описания категорий Юникода. Дополнительные сведения см. в разделе UnicodeCategory.
- Lu — UppercaseLetter
- Ll — LowercaseLetter
- Lt — TitlecaseLetter
- Lm — ModifierLetter
- Lo — OtherLetter
- Nd — DecimalDigitNumber
Чтобы создать или отобразить имя переменной, включающее пробелы или специальные символы, заключите имя переменной с фигурными скобками ({}
) символами.
Фигурные скобки направляют PowerShell для интерпретации символов имени переменной как литералы.
Имена специальных переменных символов могут содержать следующие символы:
- Любой символ Юникода со следующими исключениями:
- Закрывающая фигурная скобка () (
}
U+007D). - Символ обратной черты () (
`
U+0060). и$_
содержащие буквенно-цифровые и специальные символы. Дополнительные сведения см. в статье about_Automatic_Variables.Например, следующая команда создает переменную с именем
save-items
. Фигурные скобки ({}
) необходимы, так как имя переменной включает специальный символ дефиса (-
).${save-items} = "a", "b", "c" ${save-items}
a b c
Следующая команда возвращает дочерние элементы в каталоге, представленном переменной
ProgramFiles(x86)
среды.Get-ChildItem ${env:ProgramFiles(x86)}
Чтобы ссылаться на имя переменной, включающую фигурные скобки, заключите имя переменной в фигурные скобки и используйте символ обратного ввода для экранирования фигурных скобок. Например, чтобы создать переменную именованного
this{value}is
типа:${this`{value`}is} = "This variable name uses braces and backticks." ${this`{value`}is}
This variable name uses braces and backticks.
Переменные и область
По умолчанию переменные доступны только в области, в которой они созданы.
Например, переменная, созданная в функции, доступна только в этой функции. Переменная, созданная в скрипте, доступна только в скрипте. Если добавить в скрипт точку источника, переменная добавляется в текущую область. Дополнительные сведения см. в about_Scopes.
Модификатор области можно использовать для изменения области по умолчанию переменной. Следующее выражение создает переменную с именем
Computers
. Переменная имеет глобальную область, даже если она создается в скрипте или функции.$Global:Computers = "Server01"
Для любого скрипта или команды, выполняющегося вне сеанса, требуется
Using
модификатор области для внедрения значений переменных из области вызывающего сеанса, чтобы получить к ним доступ вне кода сеанса.Дополнительные сведения см. в about_Remote_Variables.
Сохранение переменных
Создаваемые переменные доступны только в сеансе, в котором они создаются. Они теряются при закрытии сеанса.
Чтобы создать переменную в каждом запущенном сеансе PowerShell, добавьте ее в профиль PowerShell.
Например, чтобы изменить значение переменной
$VerbosePreference
в каждом сеансе PowerShell, добавьте следующую команду в профиль PowerShell.$VerbosePreference = "Continue"
Эту команду можно добавить в профиль PowerShell, открыв
$PROFILE
файл в текстовом редакторе, например notepad.exe. Дополнительные сведения о профилях PowerShell см. в about_Profiles.Переменная: диск
Поставщик переменных PowerShell создает
Variable:
диск, который выглядит и действует как диск файловой системы, но содержит переменные в сеансе и их значения.Чтобы изменить
Variable:
диск, используйте следующую команду:Set-Location Variable:
Чтобы получить список элементов и переменных на
Variable:
диске, используйтеGet-Item
командлеты илиGet-ChildItem
командлеты.Get-ChildItem Variable:
Чтобы получить значение определенной переменной, используйте нотацию файловой системы, чтобы указать имя диска и имя переменной. Например, чтобы получить автоматическую
$PSCulture
переменную, используйте следующую команду.Get-Item Variable:\PSCulture
Name Value ---- ----- PSCulture en-US
Чтобы отобразить дополнительные сведения о
Variable:
диске и поставщике переменных PowerShell, введите:Get-Help Variable
Синтаксис переменных с путями поставщика
Вы можете префиксить путь поставщика с помощью знака доллара (
$
) и получить доступ к содержимому любого поставщика, реализующего интерфейс IContentCmdletProvider .Следующие встроенные поставщики PowerShell поддерживают эту нотацию:
- about_Environment_Provider
- about_Variable_Provider
- about_Function_Provider
- about_Alias_Provider
Командлеты переменной
PowerShell включает набор командлетов, предназначенных для управления переменными.
Чтобы получить список командлетов, введите:
Get-Command -Noun Variable
Чтобы получить справку по конкретному командлету, введите:
Get-Help <cmdlet-name>
Имя командлета Описание Clear-Variable
Удаляет значение переменной. Get-Variable
Получает переменные в текущей консоли. New-Variable
Создает новую переменную. Remove-Variable
Удаляет переменную и ее значение. Set-Variable
Изменяет значение переменной. См. также
- about_Automatic_Variables
- about_Environment_Variables
- about_Preference_Variables
- about_Profiles
- about_Quoting_Rules
- about_Remote_Variables
- about_Scopes
о переменных — PowerShell | Microsoft Learn
- Статья
Краткое описание
Описывает, как переменные хранят значения, которые можно использовать в PowerShell.
Подробное описание
Вы можете хранить все типы значений в переменных PowerShell. Например, магазин
результаты команд и хранить элементы, которые используются в командах и
выражения, такие как имена, пути, настройки и значения.Переменная — это единица памяти, в которой хранятся значения. В PowerShell,
переменные представлены текстовыми строками, начинающимися со знака доллара ($
),
например,$a
,$process
или$my_var
.Имена переменных не чувствительны к регистру и могут содержать пробелы и специальные
персонажи. Но имена переменных, содержащие специальные символы и пробелы,
сложны в использовании и их следует избегать. Для получения дополнительной информации см.
Имена переменных, содержащие специальные символы.В PowerShell существует несколько различных типов переменных.
Пользовательские переменные: Пользовательские переменные создаются и поддерживаются
Пользователь. По умолчанию переменные, которые вы создаете в команде PowerShell
строка существует только тогда, когда открыто окно PowerShell. Когда PowerShell
окна закрываются, переменные удаляются. Чтобы сохранить переменную, добавьте ее в
ваш профиль PowerShell. Вы также можете создавать переменные в скриптах с помощью
глобальная, скриптовая или локальная область.Автоматические переменные: автоматические переменные сохраняют состояние PowerShell. Эти
переменные создаются PowerShell, и PowerShell изменяет их значения по мере
требуется для поддержания их точности. Пользователи не могут изменить значение этих
переменные. Например, переменная$PSHOME
хранит путь к
Каталог установки PowerShell.Для получения дополнительной информации, списка и описания автоматических переменных см.
см. about_Automatic_Variables.Переменные предпочтений: В переменных предпочтений хранятся пользовательские настройки для
PowerShell. Эти переменные создаются PowerShell и заполняются
значения по умолчанию. Пользователи могут изменять значения этих переменных. Например,
переменная$MaximumHistoryCount
определяет максимальное количество записей
в истории сеансов.Для получения дополнительной информации, списка и описания переменных предпочтений см.
см. about_Preference_Variables.
Работа с переменными
Чтобы создать новую переменную, используйте оператор присваивания, чтобы присвоить значение переменной
переменная. Вам не нужно объявлять переменную перед ее использованием. По умолчанию
значение всех переменных$null
.Чтобы получить список всех переменных в сеансе PowerShell, введите
Получение переменной
. Имена переменных отображаются без предшествующего доллара.
($
) знак, который используется для ссылки на переменные.Например:
$MyVariable = 1, 2, 3 $Путь = "C:\Windows\System32"
Переменные полезны для хранения результатов выполнения команд.
Например:
$Processes = Get-Process $Today = (Get-Date).DateTime
Чтобы отобразить значение переменной, введите имя переменной перед
знак доллара ($
).Например:
$MyVariable
1 2 3
$Сегодня
3 сентября 2019 г., 09:46:46
Чтобы изменить значение переменной, присвойте ей новое значение.
В следующих примерах показано значение переменной
$MyVariable
, изменения
значение переменной, а затем отображает новое значение.$MyVariable = 1, 2, 3 $моя переменная
1 2 3
$MyVariable = "Зеленый кот." $моя переменная
Зеленый кот.
Чтобы удалить значение переменной, используйте командлет
Clear-Variable
или измените
значение$null
.Clear-Variable -Name MyVariable
$MyVariable = $null
Чтобы удалить переменную, используйте Remove-Variable
или Удалить-Элемент.Remove-Variable -Name MyVariable
Remove-Item - переменная пути:\MyVariable
Также можно присвоить значения нескольким переменным с помощью одного оператора.
В следующих примерах одно и то же значение присваивается нескольким переменным:$a = $b = $c = 0
В следующем примере несколько значений присваиваются нескольким переменным.
$i,$j,$k = 10, "red", $true # $i равно 10, $j равно "красному", $k равно True $i,$j = 10, "красный", $true # $i равно 10, $j равно [объекту[]], длина 2
Для получения более подробной информации см. раздел Назначение нескольких переменных
about_Assignment_Operators.Типы переменных
В переменной можно хранить объекты любого типа, включая целые числа, строки,
массивы и хеш-таблицы. И объекты, представляющие процессы, услуги, события
журналы и компьютеры.Переменные PowerShell имеют свободный тип, что означает, что они не ограничены
определенный тип объекта. Одна переменная может даже содержать коллекцию,
или массив из разных типов объектов одновременно.Тип данных переменной определяется типами .NET значений
переменная. Чтобы просмотреть тип объекта переменной, используйте
Получить член.Например:
$a = 12 # System.Int32 $a = "Слово" # System.String $a = 12, "Word" # массив System.Int32, System.String $a = Get-ChildItem C:\Windows # Типы FileInfo и DirectoryInfo
Вы можете использовать атрибут типа и нотацию приведения, чтобы гарантировать, что переменная может
содержат только определенные типы объектов или объекты, которые могут быть преобразованы в этот
тип. Если вы попытаетесь присвоить значение другого типа, PowerShell попытается преобразовать
значение к его типу. Если тип не может быть преобразован, оператор присваивания
терпит неудачу.Чтобы использовать нотацию приведения, введите имя типа, заключенное в скобки, перед
имя переменной (в левой части оператора присваивания). Следующее
пример создает переменную$number
, которая может содержать только целые числа,$words
переменная, которая может содержать только строки, и переменная$dates
, которая может
содержат только объект DateTime .[целое]$число = 8 $number = "12345" # Строка преобразуется в целое число. $номер = "Привет"
Невозможно преобразовать значение "Hello" в тип "System.Int32". Ошибка: «Введенная строка была не в правильном формате». В строке:1 символ:1 + $номер = "Привет" + ~~~~~~~~~~~~~~~~~ + Информация о категории: MetadataError: (:) [], ArgumentTransformationMetadataException + FullyQualifiedErrorId : RuntimeException
[строка]$words = "Привет" $words = 2 # Целое число преобразуется в строку. $words += 10 # Знак плюс (+) объединяет строки. $слова
210
[datetime] $dates = "12.09.91" # Строка преобразуется в объект DateTime. $ даты
Четверг, 12 сентября 1991 г., 00:00:00
$dates = 10 # Целое число преобразуется в объект DateTime. $ даты
Понедельник, 1 января 0001, 00:00:00
Использование переменных в командах и выражениях
Чтобы использовать переменную в команде или выражении, введите имя переменной перед
знаком доллара ($
).Если имя переменной и знак доллара не заключены в кавычки или если
они заключены в двойные кавычки ("
) знаков, значение переменной равно
используется в команде или выражении.Если имя переменной и знак доллара заключены в одинарные кавычки (
'
)
метки, в выражении используется имя переменной.Дополнительные сведения об использовании кавычек в PowerShell см.
about_Quoting_Rules.Этот пример получает значение переменной
$PROFILE
, которая представляет собой путь к
файл профиля пользователя PowerShell в консоли PowerShell.$ПРОФИЛЬ
C:\Users\User01\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
В этом примере показаны две команды, которые могут открыть профиль PowerShell в
блокнот.exe . В примере с двойными кавычками ("
) используются переменные
ценить.блокнот $ПРОФИЛЬ блокнот "$ПРОФИЛЬ"
В следующих примерах используются одинарные кавычки (
'
), которые обрабатывают переменную как
дословный текст.'$ ПРОФИЛЬ'
$ПРОФИЛЬ
'Используйте переменную $PROFILE.'
Используйте переменную $PROFILE.
Имена переменных, содержащие специальные символы
Имена переменных начинаются со знака доллара (
$
) и могут включать буквенно-цифровые символы.
символов и специальных символов. Длина имени переменной ограничена только
доступная память.Наилучшей практикой является использование в именах переменных только буквенно-цифровых символов.
и символ подчеркивания (_
). Имена переменных, содержащие пробелы и
другие специальные символы сложны в использовании, и их следует избегать.Буквенно-цифровые имена переменных могут содержать следующие символы:
- Символы Unicode из следующих категорий: Lu , Ll , Lt , Lm ,
Lo или Nd . - Символ подчеркивания (
_
). - Символ вопроса (
?
).
Следующий список содержит описания категорий Unicode. Для большего
информацию см. в разделе UnicodeCategory.- Lu — Прописная буква
- Ll — Строчная буква
- Lt — TitlecaseLetter
- Lm — Буква-модификатор
- Ло — ДругоеПисьмо
- Nd — DecimalDigitNumber
Чтобы создать или отобразить имя переменной, содержащее пробелы или специальные
символов, заключите имя переменной в фигурные скобки ({}
).
Фигурные скобки указывают PowerShell интерпретировать символы имени переменной.
как литералы. 9 и$_
, что
содержать буквенно-цифровые и специальные символы. Для получения дополнительной информации см.
about_Automatic_Variables.Например, следующая команда создает переменную с именем
save-items
.
фигурные скобки ({}
) необходимы, поскольку имя переменной содержит дефис (-
)
особый персонаж.${сохранить-элементы} = "а", "б", "в" ${сохранить-элементы}
а б с
Следующая команда получает дочерние элементы в каталоге, который представлен
кProgramFiles(x86)
переменная среды.Get-ChildItem ${env:ProgramFiles(x86)}
Чтобы сослаться на имя переменной, содержащее фигурные скобки, заключите имя переменной в
фигурные скобки и используйте символ обратной галочки, чтобы избежать фигурных скобок. Например, чтобы
создайте переменную с именемthis{value}is
type:${this`{value`}is} = "Имя этой переменной использует фигурные скобки и обратные кавычки." ${это`{значение`} равно}
В имени этой переменной используются фигурные скобки и обратные кавычки.
Переменные и область действия
По умолчанию переменные доступны только в той области, в которой они созданы.
Например, переменная, которую вы создаете в функции, доступна только в
функция. Переменная, которую вы создаете в скрипте, доступна только в
сценарий. Если вы используете точечный источник сценария, переменная добавляется к текущему
объем. Дополнительные сведения см. в разделе about_Scopes.Вы можете использовать модификатор области, чтобы изменить область действия переменной по умолчанию.
следующее выражение создает переменную с именемКомпьютеры
. Переменная имеет
глобальная область, даже если она создана в скрипте или функции.$Global:Computers = "Server01"
Для любого скрипта или команды, которая выполняется вне сеанса, вам потребуется
Использование
модификатор области для встраивания значений переменных из области вызывающего сеанса, чтобы
код вне сеанса может получить к ним доступ.Дополнительные сведения см. в разделе about_Remote_Variables.
Сохранение переменных
Создаваемые вами переменные доступны только в сеансе, в котором вы создаете
их. Они теряются, когда вы закрываете сеанс.Чтобы создать переменную в каждом запускаемом сеансе PowerShell, добавьте
в свой профиль PowerShell.Например, чтобы изменить значение переменной
$VerbosePreference
в каждом
PowerShell, добавьте следующую команду в свой профиль PowerShell.$VerbosePreference = "Продолжить"
Вы можете добавить эту команду в свой профиль PowerShell, открыв
$PROFILE
файл в текстовом редакторе, например notepad.exe . Для получения дополнительной информации о
Профили PowerShell, см. about_Profiles.Переменная: диск
Поставщик переменных PowerShell создает диск
Variable:
, который выглядит и
действует как диск файловой системы, но содержит переменные в вашем сеансе
и их значения.Чтобы перейти к переменной
Variable:
, используйте следующую команду:Set-Location Variable:
Чтобы вывести список элементов и переменных в диске
Variable:
, используйте кнопку 9. 0021 Получить-Элемент или
Командлет Get-ChildItem
.Переменная Get-ChildItem:
Чтобы получить значение определенной переменной, используйте нотацию файловой системы, чтобы указать
имя диска и имя переменной. Например, чтобы получить
Автоматическая переменная $PSCulture
, используйте следующую команду.Переменная Get-Item:\PSCulture
Имя Значение ---- ----- PSCulture en-US
Чтобы отобразить дополнительную информацию о переменной
: диск
и PowerShell
Поставщик переменных, тип:Get-Help Variable
Переменный синтаксис с путями провайдера
Вы можете добавить к пути провайдера префикс доллара (
$
) и получить доступ к
контент любого провайдера, реализующего
IContentCmdletProvider
интерфейс.Следующие встроенные поставщики PowerShell поддерживают это обозначение:
- about_Environment_Provider
- about_Variable_Provider
- about_Function_Provider
- about_Alias_Provider
Командлеты переменных
PowerShell включает набор командлетов, предназначенных для управления переменными.
Чтобы получить список командлетов, введите:
Get-Command -Noun Variable
Чтобы получить справку по определенному командлету, введите:
Get-Help <имя-командлета>
Имя командлета Описание Clear-Variable
Удаляет значение переменной. Получение переменной
Получает переменные в текущей консоли. Новая переменная
Создает новую переменную. Удалить переменную
Удаляет переменную и ее значение. Набор переменных
Изменяет значение переменной. См. также
- about_Automatic_Variables
- about_Environment_Variables
- about_Preference_Variables
- about_Profiles
- about_Quoting_Rules
- about_Remote_Variables
- about_Scopes
Типы данных Powershell — PowerShell
Типы данных Powershell — PowerShell — SS64. com
- SS64
- PowerShell
- Практическое руководство
Ниже перечислены наиболее распространенные типы данных (ускорители типов), используемые в PowerShell.
[строка] Строка символов Юникода фиксированной длины. [char] 16-битный символ Unicode. [байт] 8-битный беззнаковый символ [int] 32-битное целое число со знаком [long] 64-битное целое число со знаком [bool] Логическое значение True/False [decimal] 128-битное десятичное значение. [single] 32-битное число одинарной точности с плавающей запятой [double] 64-битное число двойной точности с плавающей запятой [DateTime] Дата и время [xml] XML-объект [массив] Массив значений [хэш-таблица] Объект хэш-таблицы
PowerShell имеет две встроенные переменные $true и $false для отображения логических значений true и false.
Приведение выражения к [void] фактически отбрасывает его (например, out-null или перенаправление на $null)Шестнадцатеричные литералы имеют префикс 0x, чтобы отличить их от десятичных чисел.
Двоичные литералы имеют префикс 0b, чтобы отличить их от десятичных чисел.Суффикс множителя
Можно использовать для действительных и целых чисел:
Суффикс Значение д десятичный тип данных кб множитель кибибайт
мб мебибайт множитель ГБ множитель гибибайт тб тебибайт множитель пб пебибайт множитель Таким образом, 10 МБ будет оцениваться как 10485760, а 1,2 КБ будет оцениваться как 1228,8
.
Суффиксы, используемые PowerShell, должны быть числами в степени 10 в соответствии с IEC 60027-2, но на самом деле они оцениваются как в степени 2 .PowerShell 6.2 также добавляет несколько суффиксов типов для знаковых/беззнаковых байтов/коротких/больших целых значений.
Юникод
Чтобы закодировать символ Unicode в строке PowerShell, добавьте к шестнадцатеричному значению Unicode префикс 0x, а затем приведите его к System.Char:
.
PS> [символ] 0x263a
☺Литье
Чтобы принудительно преобразовать в определенный тип данных, добавьте префикс значения или переменной к типу в квадратных скобках, это известно как Cast Operator и принудительно выбирает выбранный тип данных:
PS C:\> [целое число]»0064″
64PS C:\> [число]$false
0Обратите внимание, что при этом не выполняется проверка типов, поэтому вы можете:
PS C:\> [строка]$num = 7
PS C:\> $num + 2
72Преобразование особенно важно при чтении данных, предоставленных пользователем (с read-host). Приведение к [string] возвращает строку, даже если пользователь вводит 123
PS C:\> [datetime]$appointment = ‘2022-июль-02’
PS C:\> $назначение
02 июля 2022 г.::ParseExact также можно использовать для обеспечения анализа дат в известном формате, в этом примере $dateAsString должен соответствовать формату даты второго параметра:
PS C:\> $dateAsString = ‘2022-07-02T14:27’
PS C:\> $appointment = [datetime]::parsexact($dateAsString, ‘yyyy-MM-ddTHH:mm’, $null)
PS C:\> $appointment
02 июля 2022 14:27:00При присвоении значения переменной можно привести любую часть выражения:
$v1 = [число] 0123
[целое]$v1 = 0123
[целое]$v1 = [целое]0123Некоторые выражения будут неявно преобразованы еще до того, как вы их приведете:
PS C:\> [строка]$var = [строка]0123
PS C:\> $var
123PS C:\> [строка]$var = [строка]»0123″
PS C:\> $var
0123Шестнадцатеричные числа
Префикс «0x» к строковому значению указывает на шестнадцатеричное число.
Вы можете вызвать преобразование в [int] или [byte], приведя его:PS C:\> [байт](‘0x’ + ‘FF’)
255PS C:\> $hexnum = ‘fa00’
PS C:\> [int]»0x$hexnum»
64000Массивы
Приведение переменной массива:
[ int32 [] ] $ строго типизированный массив = @ ()
[ int32[][] ]$multiDimensionalArray = @()
Когда значение приводится к определенному типу данных, это одноразовая вещь.
Когда переменная приводится к определенному типу данных, она привязывает точно так же, как DIM Variable As DataType на других языках.
Тип данных переменной не изменится снова, если вы явно не преобразуете переменную в другой тип данных или полностью не удалите переменную (с помощью команды Remove-Variable) и не создадите ее заново.
Get-Member и GetType() отобразят текущий тип данных , но не указывает, является ли он статическим или вариантным.[число] $ тест = 0123
$тест = [строка]»00456″
# на данный момент, какой тип данных мы получим?
$test.GetType().Полное имяЕсли вы преобразуете дробное значение в целое, PowerShell выполнит Round() результат, чтобы удалить все десятичные знаки после запятой, используйте Truncate() из математической библиотеки .NET.
При преобразовании строки в [DateTime] по умолчанию принимаются даты в формате США ММ/ДД/ГГГГ или ISO 8601 ГГГГ-ММ-ДД. Вы можете переопределить это, используя ::ParseExact, чтобы указать точный формат строки даты, которую вы предоставляете.
Например, чтобы преобразовать строку даты «08-12-2012» в британском формате:
PS C:\> [DateTime]::ParseExact("12.08.2012","дд-мм-гггг",[System.Globalization.CultureInfo]::InvariantCulture) Суббота, 08 декабря 2012 г. 00:00:00
Приведите строку даты «09-Jun-2012» в формате Великобритании, а затем отобразите ее как «гггг-ММ-дд»
PS C:\> [DateTime]::ParseExact("09-Jun-2012","dd-MMM-yyyy",[System.Globalization.CultureInfo]::InvariantCulture).ToString("yyyy-MM-dd" ) 2012-06-09
Тестирование типов данных
Чтобы проверить тип данных значения, используйте оператор сравнения:
PS C:\> 32 -is [int]
Истина PS C:\> $true -is [bool]
ИстинаЕсли вы собираетесь преобразовать переменную в новый тип данных, рекомендуется сначала проверить, будет ли значение приведено успешно с помощью параметра -as.
- Закрывающая фигурная скобка () (