Подтвердить что ты не робот

В PowerShell, как я могу проверить, существует ли конкретная переменная в глобальной области видимости?

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

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

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

4b9b3361

Ответ 1

EDIT: Используйте ответ stej ниже. Моя собственная (частично некорректная) информация по-прежнему воспроизводится здесь для справки:


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

Get-Variable foo -Scope Global

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

Ответ 2

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

Test-Path variable:global:foo

Ответ 3

Личное предпочтение - использовать 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'.

Ответ 4

Простой: [boolean] (get-variable "Varname" -ErrorAction SilentlyContinue)

Ответ 5

До сих пор, похоже, что ответ, который работает, этот.

Чтобы прорваться дальше, то, что сработало для меня, было следующим:

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

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

Ответ 6

Вы можете назначить переменную возвращаемому значению 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

Ответ 7

$myvar = if ($env:variable) { $env:variable } else { "default_value" } 

Ответ 8

Там еще проще:

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