2013-05-02 32 views
9

Uygulamamda oldukça sınırlı bir PowerShell desteği eklemeye çalışıyorum: Kullanıcı tanımlı bir PowerShell betiğini periyodik olarak çalıştırma ve herhangi bir çıktı gösterme yeteneği (ve sonuçta) istiyorum İlerleme bildirimi ve kullanıcı istemi isteklerini ele alabilme. Kullanıcı komut kabuk ben konak içinden o kendisini yapmazsa, uzaktan erişim veya aynı anda birden çok komut dosyalarını çalıştırmak için yeteneği Ben interaktif destek değil ihtiyaç komut satırı-stili yapmak , ya da (Sanırım). Komut dosyası zaman uyumsuz olarak veya bir arka plan iş parçacığı üzerinde çalıştırmak isteyecek ve muhtemelen bazı başlangıç ​​değişkenleri ve belki de bir cmdlet ile kabuğunu tohumlamak istiyorum, ancak bu özellik olası olduğu gibi "fantezi" olarak.Barındırma PowerShell: PowerShell vs. Runspace vs. RunspacePool vs. Pipeline

Ben MSDN documentation about writing host application code okuma, ancak mutluRunspace veya RunspacePool veya Pipeline bir PowerShell nesne oluşturmak veya nasıl açıklarken, yaklaşık biri üzerinde bu yaklaşımların herhangi seçsin hiçbir belirti yok ettik bir diğeri.

Ben ben bu ikisinden birine aşağı olduğumu düşünüyorum ama yaklaşım daha iyi bir yapılacağı hakkında bazı geribildirim gibi ettik:

PowerShell shell = PowerShell.Create(); 
shell.AddCommand(/* set initial state here? */); 
shell.AddStatement(); 
shell.AddScript(myScript); 
shell.Invoke(/* can set host! */); 

ya:

Runspace runspace = RunspaceFactory.CreateRunspace(/* can set host and initial state! */); 
PowerShell shell = PowerShell.Create(); 
shell.Runspace = runspace; 
shell.AddScript(myScript); 
shell.Invoke(/* can set host here, too! */); 

(Gerekli PSHost türetilmiş sınıf yöntemlerinden biri EnterNestedPrompt() olup, çalıştırdığım kullanıcı tanımlı komut dosyasının çağrı yapıp yapamayacağını bilmiyorum. Eğer yapabilirse, o zaman sorumlu olurum " yeni iç içe geçmiş bir giriş loo p "(as per here) ... eğer yukarıda hangi yolu etkileyecekse, bunu bilmek de iyi olur.)

Teşekkürler!

+2

Aslında bir taşıyıcıya ihtiyaç yoktur. Sadece PS bağlı bir ev sahibi var olmadığını denetlemek için bir yol yoktur vs. Salt ana bilgisayar,-ana bilgisayar yaz çağrıları önlemek için emin olun, ama şu an bunu hatırlamıyorum. –

+0

Bir PSHost _need_ olmayabilir, ama ben benim durumumda biri _want_ ... Ben göstermek isterler ara sıra tanısal mesajınız var kullanıcı tanımlı komut bekliyorum. (Bunu daha net hale getirmek için orijinal gönderiyi düzenleyeceğim.) – JaredReisinger

cevap

1

Bunu göz ardı ediyorsunuz. Örneklerde gösterdiğiniz kod iyi bir başlangıçtır. Şimdi sadece Invoke() sonucunu okumalı ve hata ve uyarı akışlarını kontrol etmelisiniz.

PowerShell ana bilgisayarı, RunSpace'in akışla ve biçim çıktıları, ilerleme durumu, rapor hataları vb. Gibi kullanıcıyla iletişim kurmak için kullanabileceği bazı kancalar sağlar. Ne yapmak istediğinizle ilgili olarak PowerShell Ana Bilgisayarına ihtiyacınız yoktur. Sen, PowerShell sınıfını kullanarak komut yürütme geri sonuçlarını okumak hataları, uyarıları denetlemek, başvurunuzun olanaklarını kullanarak kullanıcıya çıktı akımları ve gösteri bildirimi okuyabilirsiniz. Bu, hataları algılandığında bir ileti kutusu göstermek için tüm PowerShell ana bilgisayarını yazmaktan çok daha kolay ve etkili olacaktır.

Ayrıca, PowerShell nesnesi oluşturulduğunda bir Runspace'a sahipse, ona bir tane vermeniz gerekmez. çevrenin korunmasına runspace korumak gerekiyorsa, sadece tüm PowerShell nesne ve net Komutları ve tüm Akımlar Eğer Invoke çağırmak sonra her zaman tutun.

Sormanız gereken bir sonraki soru, PowerShell :: Invoke() sonucunun nasıl işleneceği ve PowerShell :: Streams öğesinin nasıl okunacağıdır.

+0

Hey! "Tüm PowerShell nesnesini nasıl tuttuğunuzu ve Komutları ve tüm Akımları çağırdığınızda, her zaman Invoke çağırdıktan sonra" nasıl genişletirsiniz?Şu anda runspaces kullanmıyorum ve bu nedenle onları uygulamak için arıyordum, ancak bu sadece PowerShell yöntemini kullanarak bunu başarabiliyor mu? Teşekkürler!! –

+0

Lütfen doğru bir soru sorun. Yorumlarda soruları cevaplamak için bir puan yoktur. ;) – Serjx86

İlgili konular