2010-07-01 18 views
38

Tôi đang sử dụng tập lệnh PowerShell để tự động hóa giao diện người dùng của một ứng dụng WPF. Thông thường, các tập lệnh được chạy dưới dạng một nhóm, dựa trên giá trị của một biến toàn cầu. Đó là một chút bất tiện khi đặt biến này theo cách thủ công cho những lần tôi muốn chạy chỉ một tập lệnh, vì vậy tôi đang tìm cách sửa đổi chúng để kiểm tra biến này và đặt biến đó nếu không tìm thấy.Trong PowerShell, làm cách nào để kiểm tra xem một biến cụ thể có tồn tại trong phạm vi toàn cục không?

thử nghiệm con đường biến: \ foo dường như không làm việc, kể từ khi tôi vẫn nhận được lỗi sau:

The variable '$global:foo' cannot be retrieved because it has not been set.

Trả lời

15

EDIT: Sử dụng câu trả lời của stej bên dưới. riêng (một phần không chính xác) một của tôi vẫn còn sao chép ở đây để tham khảo:


Bạn có thể sử dụng

Get-Variable foo -Scope Global 

và bẫy lỗi mà được nâng lên khi biến không tồn tại.

+1

Cá nhân tôi đi với câu trả lời của stej; Tôi đã bình luận về nó và tôi cũng đã bình chọn nó. Tôi không thể xóa cái này nữa. – Joey

+1

Tôi sẽ không. Câu trả lời này cụ thể hơn cho hành động đang diễn ra, cải thiện khả năng đọc mã. – VertigoRay

+0

@VertigoRay: Sử dụng các ngoại lệ như cơ chế kiểm soát dòng chảy luôn luôn có một chút mùi xấu đối với tôi. Có, trong lịch sử bạn đã bị buộc phải làm điều đó trong ngôn ngữ vỏ nhưng điều đó không làm cho nó một ý tưởng tốt cụ thể. Trong trường hợp này, bạn muốn kiểm tra sự tồn tại của một biến. 'Test-Path' trên nhà cung cấp Variable thực hiện chính xác điều đó. Get-Variable cung cấp cho bạn giá trị hoặc lỗi. – Joey

2

Cho đến nay, có vẻ như câu trả lời mà làm việc là this one.

Để phá vỡ nó ra xa hơn, những gì làm việc cho tôi là thế này:

Get-Variable -Name foo -Scope toàn cầu ea SilentlyContinue | out-null

$? trả về true hoặc false.

+0

Hơn nữa dọc trong chủ đề đó, họ đề cập rằng biến thử nghiệm-Path: toàn cầu: foo sẽ làm việc, như mỗi câu trả lời stej của. – Timbo

150

Test-Path có thể được sử dụng với một cú pháp đặc biệt:

Test-Path variable:global:foo 
+7

1 cho việc sử dụng rất thông minh của biến PsProvider –

+0

Thx;) imo đó là cách chính xác, không có cách giải quyết như '-ErrorAction SilentlyContinue' hoặc' try/catch' với 'Get-Variable'. – stej

+1

Ah, đẹp quá. Tại sao tôi thậm chí còn bận tâm với câu hỏi PS ;-). Tuy nhiên, tôi không thể xóa câu trả lời của mình nữa. – Joey

0

Bạn có thể gán một biến để giá trị trả về của lệnh Get-Variable sau đó kiểm tra để xem nếu nó là null:

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

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

# else... 

Just lưu ý rằng biến phải được gán cho một cái gì đó cho nó để "tồn tại". Ví dụ:

$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" 
} 

Output:

foo exists 
bar does not exist 
-4

Có một cách dễ dàng hơn:

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

Tôi hiện đang gặp phải mã đó. – mbourgon

+6

Điều gì sẽ xảy ra nếu biến $ tồn tại, nhưng bằng $ false? –

2

đơn giản: [boolean] (get-biến "VARNAME" -ErrorAction SilentlyContinue)

5

Bạn có thể sử dụng:

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

Output:

False 

Ngoài ra

Bạn có thể bẫy lỗi mà được nâng lên khi biến không tồn tại.

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

Đầu ra:

WARNING: Cannot find a variable with the name 'foo'. 
Các vấn đề liên quan