В PowerShell как проверить, существует ли конкретная переменная в глобальной области видимости? - PullRequest
48 голосов
/ 01 июля 2010

Я использую сценарии PowerShell для автоматизации пользовательского интерфейса приложения WPF. Обычно сценарии запускаются как группа, основанная на значении глобальной переменной. Немного неудобно устанавливать эту переменную вручную для случаев, когда я хочу запустить только один скрипт, поэтому я ищу способ изменить их, чтобы проверить эту переменную и установить ее, если она не найдена.

Переменная test-path: \ foo, похоже, не работает, поскольку я все еще получаю следующую ошибку:

Переменная '$ global: foo' не может быть получена, поскольку она не была установлена.

Ответы [ 8 ]

181 голосов
/ 02 июля 2010

Test-Path может использоваться со специальным синтаксисом:

Test-Path variable:global:foo
21 голосов
/ 01 июля 2010

РЕДАКТИРОВАТЬ: Используйте ответ Stej ниже.Мой собственный (частично неверный) все еще воспроизводится здесь для справки:


Вы можете использовать

Get-Variable foo -Scope Global

и перехватывать ошибку, которая возникает, когда переменная не существует.

10 голосов
/ 19 ноября 2015

Личное предпочтение - использовать Ignore над SilentlyContinue, потому что это вовсе не ошибка.Поскольку мы ожидаем, что он потенциально будет $false, давайте предотвратим его (с Ignore) помещение (хотя и без вывода сообщений) в стек $Error.

Вы можете использовать:

if (Get-Variable 'foo' -Scope Global -ErrorAction 'Ignore') {
    $true
} else {
    $false
}

Более кратко:

[bool](Get-Variable 'foo' -Scope 'Global' -EA 'Ig')

Вывод:

False

В качестве альтернативы

Вы можете перехватить возникшую ошибкукогда переменная не существует.

try {
    Get-Variable foo -Scope Global -ErrorAction 'Stop'
} catch [System.Management.Automation.ItemNotFoundException] {
    Write-Warning $_
}

Выходы:

WARNING: Cannot find a variable with the name 'foo'.
3 голосов
/ 05 ноября 2014

Простой: [логическое значение] (переменная get "Varname" -ErrorAction SilentlyContinue)

2 голосов
/ 01 июля 2010

Пока что похоже, что ответ работает этот .

Чтобы разобраться в этом, у меня сработало следующее:

Get-Variable -Name foo -Scope Global -ea SilentlyContinue | из-нуль

$? возвращает true или false.

1 голос
/ 02 июля 2010

Вы можете присвоить переменную возвращаемому значению Get-Variable, а затем проверить, имеет ли она значение null:

$variable = Get-Variable -Name foo -Scope Global -ErrorAction SilentlyContinue

if ($variable -eq $null)
{
    Write-Host "foo does not exist"
}

# else...

Просто имейте в виду, что переменная должна быть назначена чему-либо для неесуществовать".Например:

$global:foo = $null

$variable = Get-Variable -Name foo -Scope Global -ErrorAction SilentlyContinue

if ($variable -eq $null)
{
    Write-Host "foo does not exist"
}
else
{
    Write-Host "foo exists"
}

$global:bar

$variable = Get-Variable -Name bar -Scope Global -ErrorAction SilentlyContinue

if ($variable -eq $null)
{
    Write-Host "bar does not exist"
}
else
{
    Write-Host "bar exists"
}

Вывод:

foo exists
bar does not exist
0 голосов
/ 26 июня 2019
$myvar = if ($env:variable) { $env:variable } else { "default_value" } 
0 голосов
/ 08 июля 2013

Есть еще более простой способ:

if ($variable)
{
    Write-Host "bar exist"
}
else
{
    Write-Host "bar does not exists"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...