28.09.2022
Лого

Переменные и массивы в powershell

Переменные powershell

Переменные – это именованные ссылки на области памяти, которые содержат данные конкретного типа. В powershell имена всех переменных начинаются со знака $ (доллар). При сохранении значения в переменную powershell определяет тип данных автоматически. Но так же Вы можете явным образом обозначить тип данных переменной при ее объявлении. Для этого нужно указать тип данных в квадратных скобках перед $, например:

[int64]$num = 2 # переменная num целочисленного типа

Если попытаться этой переменной присвоить текстовые данные, то мы получим ошибку:

$num = "text"
Не удается преобразовать значение "text" в тип "System.Int64". Ошибка: "Входная строка имела неверный формат."
строка:1 знак:1
+ $num = "text"
+ ~~~~~~~~~~~~~
    + CategoryInfo          : MetadataError: (:) [], ArgumentTransformationMetadataException
    + FullyQualifiedErrorId : RuntimeException

Имена переменных не являются регистрозависимыми и могут содержать цифры и спецсимволы. Значением переменной могут быть как сами данные конкретного типа, так и объекты целиком.

При запуске консоли powershell в сеансе автоматически определяется набор системных переменных. Посмотреть список всех переменных в сеансе можно с помощью команды Get-Variable. Среди которых будут как определенные по умолчанию (системные), так и созданные пользователем. Таким образом можно получить список их наименований и значений в одном выводе. Наиболее используемыми и полезными системными переменными могут быть:

ConfirmPreference      High
DebugPreference        SilentlyContinue
Error                  {}
ErrorActionPreference  Continue
Host                   System.Management.Automation.Internal.Host.InternalHost
InformationPreference  SilentlyContinue
WarningPreference      Continue
VerbosePreference      SilentlyContinue
PID                    99999
PROFILE                C:\Users\*****\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PSCulture              ru-RU
PWD                    C:\Windows\system32
PSHOME                 C:\Windows\System32\WindowsPowerShell\v1.0

Подробную информацию о системных переменных можно посмотреть тут.

Помимо пользовательских и автоматических переменных powershell так же позволяет обращаться к переменным окружения. Пользователям Windows переменные могут быть доступны в графическом интерфейсе в свойствах системы:

Переменные окружения Windows
Переменные окружения Windows

Powershell позволяет обращаться к ним, используя специальный префикс: $env:<название>. Таким образом Вы можете получать значения этих переменных и взаимодействовать с ними.

PS C:\Windows\system32> $env:AppData
C:\Users\cherd\AppData\Roaming

PS C:\Windows\system32> $env:OS
Windows_NT

PS C:\Windows\system32> $env:NUMBER_OF_PROCESSORS
16

Массивы в powershell

Массив – это структура данных для хранения набора элементов, переменных или объектов целиком. Так же как и переменные массивы могут быть фиксированного типа данных. Для этого при объявлении массива тип данных так же указывается в квадратных скобках. Например, [int64[]]$arr = @() – объявление пустого целочисленного массива.

Каждый элемент массива имеет свой индекс. Что дает возможность обращаться к каждому элементу массива по отдельности. В качестве элемента могут выступать и другие массивы.

Существует несколько способов объявления массивов:

  • Явно через запятую перечислить все значения:
$arr1 = @("text", 123, $true, $(Get-Service))    
$arr1 = "text", 123, $true, $(Get-Service)

В данном случае первым элементом будет текст. Вторым – целое число. Третьим – логическая истина. Четвертым – массив, список объектов (служб), полученных с помощью команды Get-Service. Оба способа являются эквивалентными. Но используя конструкцию @() без аргументов, можно объявить и пустой массив:

$arr1 = @()            # объявление пустого массива любого типа
[string[]]$arr = @()  # объявление пустого массива фиксированного строкового типа
  • Использовать диапазоны значений:
$arr2 = 1..100      # переменная $arr2 будет содержать набор целочисленных элементов от 1 до 100

! Начиная с powershell версии 6, Вы так же можете применять и буквенные диапазоны:

$arr2 = "a".."z" # переменная $arr2 будет содержать набор символов от a до z

Чтобы узнать версию powershell, выполните – (Get-Host).Version

  • Получить набор элементов (объектов) с помощью выполнения команды:
$arr3 = Get-Service  # здесь будет получен массив объектов (служб)

Обращаться к элементам массива можно с помощью указания их индекса. Индекс всегда начинается с нуля. Таким образом, чтобы обратиться к первому элементу выполните – $arr3[0]. И по этой же причине при обращении к последнему элементу индекс необходимо уменьшать на 1:

$arr3[$arr3.count - 1]

Технически любые строки (объекты типа string) – это одномерные массивы символов. И мы имеем возможность обращаться к каждому символу в строке по их индексу, выполните:

$hello = "Hello World"
0..($hello.length - 1) | Foreach-Object {$hello[$_]}

Чтобы изменить конкретный элемент массива, необходимо указать его индекс.

$arr4 = 1, 1, 1, 1, 1
$arr4[2] = 3
$arr4

# Вывод:
1
1
3
1
1

Попробуйте решить следующую задачку и посчитать, чему будет равен массив $b:

$a = 0
$b = 1,2
$c = -1,-2
$b[$a] = $c[1]

Анонс следующей статьи: “Провайдеры и диски в powershell”.

Игорь Чердаков

Мне 32 года. За моими плечами 8 лет опыта работы в IT, 4 из которых в администрировании. Сопровождая немалую инфраструктуру, в ежедневной деятельности я сталкиваюсь с необходимостью автоматизации рутинных процессов, в чем мне успешно помогает Powershell. Данный блог основывается на моем личном опыте и знаниях. Мои статьи не являются истиной в последней инстанции и я положительно отношусь к обоснованной и конструктивной критике. По этому я приглашаю Вас обсуждать волнующие нас вопросы, связанные с Powershell.

Посмотреть все записи автора Игорь Чердаков →

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *