2013-04-17 16 views
6

Son birkaç aydır Powershell (2.0) 'da dalga geçiyorum ve iş süreçlerindeki bazı işlemleri modernize etmek ve standartlaştırmak için kullanmayı tercih ediyorum - çoğunlukla DOS tabanlı süreçler. Çalışmanın doğası gereği, aynı betik (ler) in bir seferde 100 kadar çalışması olabilir.Powershell -sta (apartman eyaleti) tercih edilir mi?

İlk - Powershell "güvenli" bu şekilde kullanılıyor mu? Gördüğüm gibi -STA bir yürütme seçeneği olarak - aynı komut dosyasını aynı anda çalıştığında Powershell ile çalışmanın tercih edilen yöntemi mi, yoksa sadece gerekli olduğu zaman kullanılan bir şey mi? Aramamda, "Ne zaman apartman dairesini kullanmalıyım?" Ben inanıyorum, yapmak istediğim betiklerin tümü işlenmeyecek olsa bile.

Powershell apartmanına ışık tutabilecek herkes için şimdiden teşekkür ederiz!

+1

en iyi şekilde, -STA'nın GUI/Formlar kullanan powershell kodunda veya IE'ye erişirken, bunun ötesinde, bunun dışında kullanılması yararlı mıdır? – Barb

cevap

9

PSv2'de, konsol ana bilgisayarı MTA olarak çalışır ve ISE STA olarak çalışır. PSv3'te konsol defaults to STA.

Sen apartman devlet bununla ne olduğunu görebilirsiniz:

[System.Threading.Thread]::CurrentThread.GetApartmentState() 

STA mesela kullanmak COM nesneleri ile anlaşma .NET ile belirli bir sınıf kullanırken kullanmak gerekir sadece zaman System.Windows.Forms.Clipboard.

STA değiştirmek Bildiğim iki yolu vardır:

powershell.exe -Sta -File MyScript.ps1 

Ya

$ps = [PowerShell]::Create() 
$rs = [RunSpaceFactory]::CreateRunspace() 
$rs.ApartmentState = "STA" 
$rs.ThreadOptions = "ReuseThread" 
$rs.Open() 
$ps.Runspace = $rs 
$ps.AddScript({ ([System.Threading.Thread]::CurrentThread.GetApartmentState()) }).Invoke() 

Yani soru gerçekten neden yerine STA pSV2 konsol MTA nedir? PS ekibinin neden bu gibi kararlar verdiğini öğrenmek istediğimde, genellikle Bruce Payette'in PowerShell in Action kitabına başvuruyorum. Ne yazık ki neden olduğunu söylemedi. Sadece STA gerektiren bazı COM nesneleri olduğunu ve betiğiniz çalışmazsa bunu STA olarak yeniden çalıştırmayı denediniz.

+0

"STA'yı kullanmanız gereken tek zaman, .NET'de belirli sınıfları kullanan COM nesnelerini kullanırken," - sanırım sonunda aradığım cevap bu. Teşekkürler. – Barb

İlgili konular