2012-02-08 13 views
10

Powershell çevresindeki dizilerde ve çift tırnaklarda bazı garip davranışlar buldum. İlk öğeyi bir dizide oluşturup yazdıysam, örneğin:Powershell, çift tırnak içinde içe aktarılırken dizi öğeleri çıktı olarak veriyor

$test = @('testing') 
echo $test[0] 

Output:  
testing 

Her şey iyi çalışıyor. Ben onun etrafında çift tırnak koymak Ama eğer:

echo "$test[0]" 

Output: 
testing[0] 

Sadece $ testi değişken değerlendirildi ve [0] dizi işaretleyici bir dize olarak tam anlamıyla tedavi edildi. Kolay düzeltme, ikili değişkenlerde dizi değişkenlerini enterpolasyondan kaçınmak veya ilk önce başka bir değişkene atamaktır. Ama bu davranışın tasarımdan mı geçtiğini merak ediyordum?

+0

olarak yazılmalıdır Açık değil, ama sonuçta bu bir çift kopyadır. 1145704/45375). – mklement0

cevap

15

Dolayısıyla, enterpolasyon kullandığınızda, varsayılan olarak toto'daki bir sonraki değişkeni enterpolasyon yapar. Bunu yaparken Yani:

"$test[0]" 

Bir sonraki değişken olarak $ testini görür, bu bir dizidir fark eder ve onu bir dizi Gösterilecek iyi yolu, bu karar bu yüzden arasına sokmak olamaz sahip olduğunu ve sadece dizeyi bir dize olarak görüntüler. Bu davranış benim ana sebeplerinden biridir

"$($test[0])" 

Not olduğunu biçimlendirilmiş dizeleri kullanılarak yerine interpolasyon dayanarak için:

"{0}" -f $test[0] 
çözüm bit başlar interpolasyon yapmak ve nerede durur nerede açıkça powershell söylemektir Bu gibi durumlarda
+0

Geri dönüp kod etiketleri ekledim, teşekkürler @Andy Arismendi. – EBGreen

+1

Çözümleriniz etkilidir, ancak açıklamanız doğru değildir. Dize enterpolasyonu sadece <$ 'olarak ayrıştırmak için _syntactically_ sınırlı. Değişken adında geçerli olmayan herhangi bir karakter ayrıştırma işlemini durdurur, örneğin, bu durumda. PowerShell, öğeleri (varsayılan olarak) öğeler arasında tek bir boşlukla ayırarak, yani _entire_ array '$ test'ini mutlu bir şekilde genişletir. Aşağıdaki [0] 'basitçe bir editör olarak ele alınır ve '$ test''in bir dizgeye nasıl dönüştürüldüğüne dair bir dayanağı yoktur. – mklement0

6

yapmanız gereken:

echo "$($test[0])" 

diğer alternatif dize biçimlendirme kullanmaktır

echo "this is {0}" -f $test[0] 

Dizelerdeki özelliklere erişirken durumun bu olacağına dikkat edin. "$a.Foo" gibi - "$($a.Foo)"

İlgili konular