В PowerShell, как я могу проверить, существует ли конкретная переменная в глобальной области видимости?
Я использую сценарии PowerShell для некоторой автоматизации пользовательского интерфейса приложения WPF. Обычно сценарии запускаются как группа, основанная на значении глобальной переменной. Немного неудобно устанавливать эту переменную вручную в те моменты, когда я хочу запустить только один script, поэтому я ищу способ изменить их, чтобы проверить эту переменную и установить ее, если она не найдена.
test-path variable:\foo, похоже, не работает, так как я все еще получаю следующую ошибку:
Переменная 'global: foo' не может быть восстановлена, поскольку она не была установлена.
Ответы
Ответ 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"
}