Как использовать переменные PowerShell
Переменные в PowerShell используются для хранения значений, данных или другой информации, которая может понадобиться позже в вашем скрипте. Они также могут быть использованы для захвата результатов cmdlet. Но как создать переменные и использовать их за пределами функции, например?
В PowerShell существуют различные области, к которым могут принадлежать переменные. Области защищают переменные от изменения, но они также могут помешать вам получить доступ к переменной, которую вы создали в функции.
В этой статье мы собираемся рассмотреть, как назначать и использовать переменные, а также как использовать их в различных областях видимости.
Переменные PowerShell
Давайте начнем с основ переменных PowerShell, прежде чем мы рассмотрим все тонкости. Чтобы создать переменную в PowerShell, мы будем использовать знак доллара $. Имя переменной не является чувствительным к регистру и обычно пишется в camelCase (с заглавной буквой в начале каждого слова, кроме первого).
$newVariable = "LazyAdmin"
Имена переменных могут содержать пробелы и специальные символы, но вы действительно должны этого избегать. Пробелы и специальные символы усложнят чтение кода и приведут к множеству опечаток в вашем скрипте.
Также полезно знать, что вам не нужно указывать тип для вашей переменной. Переменные PowerShell слабо типизированы, что означает, что строковая переменная может изменить тип на целое число, массив или хэш-таблицу, например.
$newVariable = "LazyAdmin" # String - System.String
$newVariable = 123 # Integer - System.Int32
$newVariable = "Apple", "Grapes", "Kiwi" # Array - Array of System.StringЧто вам также нужно знать, так это то, что в PowerShell есть три типа переменных. Мы здесь не говорим о том, является ли переменная строкой или целым числом, а о том, откуда происходит переменная.
- Пользовательские переменные & #8211; Это переменные, как показано в приведенных выше примерах, переменные, которые создаются и поддерживаются вами. Пользовательские переменные существуют только в текущей сессии PowerShell. Как только вы закроете окно PowerShell, переменная и ее значение исчезнут.
Однако есть одно исключение: переменные, созданные в вашем профиле PowerShell, сохраняются и могут использоваться в различных сессиях PowerShell. - Автоматические переменные – Автоматические переменные создаются и управляются PowerShell и хранят информацию о состоянии. Например,
$error,$homeили$profileявляются некоторыми из автоматических переменных PowerShell. Полный список можно найти здесь. - Переменные предпочтений – Эти переменные также создаются с помощью PowerShell, но разница в том, что вы можете изменять эти переменные для настройки поведения PowerShell. Хорошим примером является переменная
$ErrorActionPreference, которая позволяет установить, что PowerShell должен делать, когда возникает ошибка. Вы можете найти все переменные предпочтений здесь.
Создать и установить переменные
Как уже было кратко упомянуто в начале, создание переменной довольно простое дело. Для простой, слабо типизированной переменной вам нужно всего лишь указать имя переменной.
$newVariable = $nullТакже возможно создать переменную в PowerShell без указания какого-либо значения, даже не $null. Для этого вам придется использовать командлет Set-Variable, который создаёт переменную со значением $null для вас.
Set-Variable -Name $nullКомандлет set-variable имеет некоторые преимущества при создании переменной, например, вы можете дать описания вашей переменной или сделать её доступной для чтения в интернете. Но, как правило, он не используется часто.
При создании переменных в PowerShell вам не нужно указывать, является ли она строкой или целым числом, что действительно удобно. Но при создании функции, ожидающей целое число, будет хорошей идеей явно указать, что переменная является целым числом.
Чтобы указать тип при создании переменной, вам необходимо использовать нотацию приведения. Вы делаете это, помещая имя типа в скобки перед переменной:
[string]$stringVariable = "Hello" # Can only contain a string
[int]$numberVariable = 15 # Can only contain a integer
[datetime]$dateVar = "01/15/24" # Accepts only datatime objectsКак вы можете видеть в последнем примере (переменная datetime), нам не нужно устанавливать объект datetime. PowerShell примет значение, если оно может быть преобразовано в правильный тип.
Возьмем для примера целочисленную переменную, она не примет строку с словом, но примет число в строке, потому что может привести его к целому числу.
[int]$numberVariable = 15
$numberVariable = "LazyAdmin"
Error result
Cannot convert value "LazyAdmin" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:1
This does work however:
$numberVariable = "55"
Тип переменной PowerShell
Если вы хотите узнать, каков тип переменной в PowerShell, вам нужно использовать метод GetType(). Это вернет базовый тип, имя типа и много другой информации о переменной. Чтобы отобразить только имя типа, выберите свойство имени:
$numberVariable.GetType().name
Result
Int32Очистить переменную PowerShell
Чтобы очистить переменную в PowerShell, у вас есть два варианта: вы можете использовать командлет Clear-Variable или просто переписать переменную значением $null. Командлет делает абсолютно то же самое, поэтому самым удобным методом является присвоение значения $null таким образом.
$newVariable = $null
Alternative
Clear-Variable -Name newVariableУдаление переменных
Другой вариант - удалить переменные в PowerShell. Это полностью удалит переменную и её значение из вашей сессии PowerShell. Для этого вам нужно использовать командлет Remove-Variable.
Когда вы хотите удалить или очистить переменную в PowerShell по соображениям безопасности, есть несколько вещей, которые следует иметь в виду. PowerShell основан на .Net, и .Net использует сборщик мусора для очистки памяти от предметов, которые больше не нужны.
Но пока сборщик мусора не пройдет, значение вашей переменной все еще будет доступно в памяти вашего компьютера. Команда Clear-Variable на самом деле создает копию переменной и помечает старую для сбора. В то время как команда Remove-Variable помечает оригинал для сбора.
Поэтому, если вам нужно удалить защищённую строку, пароль или другую конфиденциальную информацию из памяти, то лучше всего вызывать сборщик мусора .Net сразу после того, как вы изменили переменную на $null.
$newVariable = $null
[System.GC]::Collect() # Call .Net Garbage CollectorНапечатать переменную
Чтобы напечатать переменную в PowerShell, вы можете просто ввести имя переменной (со знаком $) в консоли для вывода значения. В скрипте вы обычно будете использовать командлет Write-Host для вывода значения переменной.
$numberVariable = "LazyAdmin"
Directly in a console
$numberVariable
In a script
Write-Host $numberVariableКогда вы хотите включить переменную в строку, вы должны убедиться, что используете двойные кавычки " ". Только тогда будет использовано значение переменной. Если вы используете одинарную кавычку, то имя переменной будет использовано как выражение.
$numberVariable = "LazyAdmin"
Write-Host "You are reading $numberVariable"
Result
You are reading LazyAdmin
Write-Host 'The variable $numberVariable contains a string'
Result
The variable $numberVariable contains a string
Если переменная содержит объект, то вы можете вывести разные свойства, используя нотацию .. Вы указываете имя переменной, за которым следует точка и имя свойства. Рассмотрим следующую хэш-таблицу:
$currentDC = [PSCustomObject]@{
"HostName" = "DC1"
"OS" = "Windows Server 2019"
"OS Version" = "10.0.17763"
"IP Address" = "192.168.1.1"
}Чтобы напечатать HostName переменной $currentDC, мы можем написать:
Write-Host $currentDC.HostnameНо когда вы хотите использовать то же свойство внутри строки, вам нужно обернуть это в скобки, вот так:
Write-Host "The hostname is $($currentDC.Hostname)"Области видимости переменных
В PowerShell у нас есть три области, в которых может работать переменная:
- Глобальный – Это эффективно в вашей текущей сессии PowerShell. Содержит автоматические и переменные предпочтений. Также переменные, определенные в вашем профиле PowerShell, хранятся здесь.
- Скрипт – Это создаётся во время выполнения файла скрипта. Команда в скрипте выполняется в рамках области видимости скрипта.
- Локальный – Текущая область, может быть глобальной, скриптовой или областью внутри функции.
Переменные видимы и доступны только в своей текущей области видимости и в областях, находящихся ниже по иерархии. Переменные внутри глобальной области видимости всегда доступны внутри скрипта или локальной области.
Например, когда вы объявляете переменную внутри функции, вы не можете получить к ней доступ вне этой функции:
function Get-AuthToken {
[CmdletBinding()]
param (
[string] $TenantId
)
# Some code to get a token
$token = Get-MSCloudIdAccessToken -TenantId $TenantId
}
Get-AuthToken
The variable $token would be $null in this case
Get-MSCloudData -Token $token -User 'Test'Для доступа или обновления переменных внутри другой области видимости вам нужно использовать модификатор области видимости для доступа к ней. Таким образом, в приведенном выше примере мы можем сохранить переменную $token внутри глобальной области. Таким образом, мы можем использовать $token и в других функциях.
Define the global variable
$global:token = $null
function Get-AuthToken {
[CmdletBinding()]
param (
[string] $TenantId
)
# Some code to get a token
$global:token = Get-MSCloudIdAccessToken -TenantId $TenantId
}
Run the function
Get-AuthToken
$global:token will now contain the token that we need
Get-MSCloudData -Token $global:token -User 'Test'Еще одна распространенная ситуация возникает, когда вам нужно получить доступ к переменной за пределами цикла ForEach-Object или за пределами блока скрипта Invoke-Command. В таких случаях вы можете получить доступ к родительской переменной с помощью модификатора $using: . В приведенном ниже примере мы можем получить доступ к сервисам внутри блока скрипта с помощью $using:services.
$services = @(
'EventSystem',
'w32time',
'netlogon'
)
$stoppedServices = Invoke-Command -Computername $computername -ScriptBlock {Get-Service -Name $using:services | where {$_.Status -eq 'Stopped'}}Старайтесь минимизировать использование глобальной области видимости насколько это возможно, потому что это сделает ваш код трудночитаемым, и к нему можно будет обратиться откуда угодно в скрипте. Если вы используете глобальные переменные в PowerShell, объявите их в начале скрипта.
Список переменных
Вы забыли имя переменной? Или хотите узнать, какие переменные вы в настоящее время использовали? Вы можете просмотреть все переменные в ваших сеансах с помощью cmdlet Get-Variable. Это выведет список всех глобальных и локальных переменных и их сеансов.
Если вы запустите командлет без каких-либо параметров, то он вернет все переменные. Чтобы помочь вам найти переменную, командлет Get-Variables имеет несколько параметров. Например, мы создали переменную со словом number в ней, но не знаем точного имени.
Чтобы найти имя переменной, вы можете использовать параметр -name и * в качестве подстановочного знака:
Get-Variable -name *number*
Result
Name Value
---- -----
numberVariable LazyAdminВы также можете использовать параметр -Include или -Exclude, чтобы выбрать только те переменные, которые содержат (или не содержат) определенную строку. Если вы хотите только просмотреть значение переменной, используйте параметр -ValueOnly.
Завершение
Переменные являются основой каждого языка программирования или скриптового языка, включая PowerShell. Они позволяют вам хранить информацию и использовать её позже в вашем скрипте. Всегда выбирайте ясные и значимые имена для ваших переменных.
Глобальные переменные имеют свое место, но старайтесь свести их использование к минимуму. Они усложняют чтение вашего кода и отладку.
Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже.


