2010-05-04 20 views
7

PowerShell'de komut dosyası kapsamındaki bir değişkenin varlığını sınamak mümkün mü?PowerShell'de bir komut dosyası kapsamındaki değişkenin varlığı nasıl test edilir?

Ben PowerShell Community Extensions (PSCX) ama Set-PSDebug -Strict ayarlanır sırasında modülü içe eğer bir hata üretilir fark ettik kullanıyorum:

The variable '$SCRIPT:helpCache' cannot be retrieved because it has not been set. 
At C:\Users\...\Modules\Pscx\Modules\GetHelp\Pscx.GetHelp.psm1:5 char:24 

bunu düzeltmek nasıl araştırırken buldum bu kod parçası Pscx.GetHelp.psm1:

#requires -version 2.0 

param([string[]]$PreCacheList) 

if ((!$SCRIPT:helpCache) -or $RefreshCache) { 
    $SCRIPT:helpCache = @{} 
} 

Bu oldukça düz ileri koddur; Önbellek yoksa veya yenilenmesi gerekiyorsa, yeni ve boş bir önbellek oluşturun. Sorun şu ki, $SCRIPT:helpCache, Set-PSDebug -Strict etkinken, değişkenin henüz tanımlanmadığı için hatayı düzeltiyor.

İdeal olarak, bir Test-Variable cmdlet'ini kullanabilirdik ama böyle bir şey mevcut değil! variable: sağlayıcısına bakmayı düşündüm ama bir değişkenin kapsamını nasıl belirleyeceğimi bilmiyorum.

Bu yüzden sorum şu: Bir hatanın nedenini test etmek için Set-PSDebug -Strict'un geçerli olup olmadığını nasıl test edebilirim, bir hataya neden olmadan?

+3

PowerShell 2.0 kullanıyorsanız, olası ek sorunları yakalayacağından 'Set-StrictMode -version 2.0' kullanmanızı öneririz. –

cevap

5

Kullanım test-path variable:SCRIPT:helpCache

if (!(test-path variable:script:helpCache)) { 
    $script:helpCache = @{} 
} 

Bu sorun olmadan benim için çalışıyor. bu kodu kullanarak İşaretli:

@' 
Set-PsDebug -strict 
write-host (test-path variable:script:helpCache) 
$script:helpCache = "this is test" 
write-host (test-path variable:script:helpCache) and value is $script:helpCache 
'@ | set-content stricttest.ps1 

.\stricttest.ps1 
+0

Gerçekten benim için çalışan bir örnek ekledim. Herhangi bir sorununuz varsa, sorunların ne olduğunu bilmem gerekir;) – stej

+2

Bu muhtemelen en iyi yoldur. [H] elpCache ile hile daha hızlı (sadece biraz) ama hacky. Ayrıca, Test Yolu yolu, bir değişkenin adı bir değişkenin kendisi olduğunda daha iyidir, yani Test yolu değişkeni: komut dosyası: $ name –

+0

FWIW, 'test yolu değişkeni'ni kullanarak: 'genellikle PSCX’te aldığımız yaklaşımdır. Bu geceye daha sonra bu konuya bir göz atacağım. –

1

Sen -Scope parametreyle Get-Variable kullanabilirsiniz. Bu cmdlet (varsayılan olarak en azından) sadece değişkenin değerini ancak PSVariable nesneyi döndürmez ve değişken bulunmazsa bir istisna durumu:

Get-Variable [h]elpCache -Scope Script 

:

Get-Variable foo -Scope script 
+0

@Johannes Cevabı için teşekkürler. Yine de kaçınmaya çalıştığım 'Get-Variable' tarafından atılan istisnadır. Bunu "try/catch" ile yapabilirim, ama çıkış penceremde kırmızı metinleri kıran daha okunaklı bir yol olup olmadığını bilmek isterim. :) –

+0

* Get-Değişken -ErrorAction SilentlyContinue * hile yapmalı. Komut çağrısının sonucunu kontrol edebilirsiniz. N.B. Hata, maalesef $ Error listesine eklenmiştir. –

+0

@Roman Kuzmin '-ErrorAction' hile yardım etmedi. Utanç, çünkü bu iyi bir çözüm gibi görünüyor. –

4

de bunu dene [h]elpCache joker karakterini kullandığımız için herhangi bir hata atmamalı veya yaymamalıyız. Öte yandan bu tür bir joker, gerçek bir isim de factodur.

+0

kapsam kullanmıyorum Bu düzgün bir :-) :-) – Joey

+2

Evet, bu yol hacky. @stej daha iyi bir çözüm önermektedir. Yine de, sahte joker ile hile birçok durumda, örn. Get-Process için (işlemler için Test Yolu alternatifi yoktur). –

+0

Kesinlikle hatırlayacağım bir numara. –

İlgili konular