Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şimdi Windows Admin Center Uzantıları SDK'sına daha ayrıntılı bir şekilde bakalım. Şimdi uzantınıza PowerShell komutları ekleme hakkında konuşalım.
TypeScript'te PowerShell
Gulp derleme işlemi, {!ScriptName}.ps1 klasörüne yerleştirilen herhangi bir \src\resources\scripts öğesini alır ve powershell-scripts klasörünün altındaki \src\generated sınıfına dönüştüren bir oluşturma adımına sahiptir.
Note
powershell-scripts.ts ve strings.ts dosyalarını el ile güncellemeyin. Yaptığınız değişiklikler, bir sonraki oluşturma sırasında üzerine yazılacaktır.
PowerShell Betiği Çalıştırma
Herhangi bir düğümde çalıştırmak istediğiniz betikler \src\resources\scripts\{!ScriptName}.ps1 içine yerleştirilebilir.
Important
Bir {!ScriptName}.ps1 dosyada yapılan değişiklikler, çalıştırılana kadar gulp generate projenize yansıtılmaz.
API, öncelikle hedeflediğiniz düğümlerde PowerShell oturumları oluşturarak ve geçirilmesi gereken parametrelerle PowerShell betiğini hazırlayarak çalışır, ardından oluşturulan oturumlarda bu betiği çalıştırır.
Örneğin, şu betiğimiz \src\resources\scripts\Get-NodeName.ps1vardır:
Param
(
[String] $stringFormat
)
$nodeName = [string]::Format($stringFormat,$env:COMPUTERNAME)
Write-Output $nodeName
Hedef düğümümüz için bir PowerShell oturumu oluşturacağız:
const session = this.appContextService.powerShell.createSession('{!TargetNode}');
Ardından giriş parametresiyle PowerShell betiğini oluşturacağız:
const command = PowerShell.createCommand(PowerShellScripts.Get_NodeName, {stringFormat: 'The name of the node is {0}!'});
Son olarak, bu betiği oluşturduğumuz oturumda çalıştırmamız gerekir:
public ngOnInit(): void {
this.session = this.appContextService.powerShell.createAutomaticSession('{!TargetNode}');
}
public getNodeName(): Observable<any> {
const command = PowerShell.createCommand(PowerShellScripts.Get_NodeName, { stringFormat: 'The name of the node is {0}!'});
return this.appContextService.powerShell.run(this.session, command)
.pipe(
map(
response => {
if (response && response.results) {
return response.results;
}
return 'no response';
}
)
);
}
public ngOnDestroy(): void {
this.session.dispose()
}
Şimdi yeni oluşturduğumuz gözlemlenebilir işleve abone olmamız gerekir. PowerShell betiğini çalıştırmak için işlevini çağırmanız gereken yere yerleştirin:
this.getNodeName().subscribe(
response => {
console.log(response)
}
);
createSession yöntemine düğüm adı sağlayarak yeni bir PowerShell oturumu oluşturulur, kullanılır ve PowerShell çağrısı tamamlandıktan sonra hemen yok edilir.
Tuş Seçenekleri
PowerShell API'sini çağırırken birkaç seçenek kullanılabilir. Bir oturum her oluşturulduğunda anahtarlı veya anahtarsız olarak oluşturulabilir.
Anahtar: Bu, bileşenler arasında bile aranabilen ve yeniden kullanılabilen anahtarlı bir oturum oluşturur (Bileşen 1'in "SME-ROCKS" anahtarıyla bir oturum oluşturabileceği ve Bileşen 2'nin aynı oturumu kullanabileceği anlamına gelir). Bir anahtar sağlanırsa, oluşturulan oturum yukarıdaki örnekte olduğu gibi dispose() çağrılarak atılmalıdır. Bir oturum, 5 dakikadan uzun süre kullanılmadan bırakılmamalıdır.
const session = this.appContextService.powerShell.createSession('{!TargetNode}', '{!Key}');
Anahtarsız: Oturum için otomatik olarak bir anahtar oluşturulur. bu oturum 3 dakika sonra otomatik olarak kapatılacaktır. Anahtarsız kullanmak, uzantınızın oturum oluşturulurken zaten kullanılabilir olan herhangi bir çalışma alanının kullanımını geri dönüştürmesine olanak tanır. Kullanılabilir bir çalışma alanı yoksa yeni bir çalışma alanı oluşturulur. Bu işlev tek seferlik çağrılar için iyidir, ancak yinelenen kullanım performansı etkileyebilir. Oturumun oluşturulması yaklaşık 1 saniye sürer, bu nedenle oturumların sürekli geri dönüştürülmesi yavaşlamalara neden olabilir.
const session = this.appContextService.powerShell.createSession('{!TargetNodeName}');
or
const session = this.appContextService.powerShell.createAutomaticSession('{!TargetNodeName}');
Çoğu durumda ngOnInit() yönteminde anahtarlı bir oturum oluşturun ve ardından ngOnDestroy() içinde boşaltın. Bir bileşende birden çok PowerShell betiği varsa ancak temel oturum bileşenler arasında paylaşılmıyorsa bu düzeni izleyin.
En iyi sonuçlar için, oturum oluşturma işleminin hizmetler yerine bileşenlerin içinde yönetildiğinden emin olun; bu, yaşam süresi ve temizlemenin düzgün yönetilebilmesine yardımcı olur.
En iyi sonuçlar için, oturum oluşturma işleminin hizmetler yerine bileşenlerin içinde yönetildiğinden emin olun; bu, yaşam süresi ve temizlemenin düzgün yönetilebilmesine yardımcı olur.
PowerShell Akışı
Uzun süre çalışan bir betiğiniz varsa ve veriler aşamalı olarak çıkarılırsa, PowerShell akışı betiğin bitmesini beklemek zorunda kalmadan verileri işlemenize olanak sağlar. Gözlemlenebilir next() veri alınır alınmaz çağrılır.
this.appContextService.powerShellStream.run(session, script);
Uzun Süre Çalışan Betikler
Arka planda çalışması gereken uzun süreli çalışan bir komut dosyanız varsa, bir iş öğesi gönderilebilir. Senaryonun durumu Ağ Geçidi tarafından izlenecek ve durum güncellemeleri bir bildirime gönderilebilecektir.
const workItem: WorkItemSubmitRequest = {
typeId: 'Long Running Script',
objectName: 'My long running service',
powerShellScript: script,
//in progress notifications
inProgressTitle: 'Executing long running request',
startedMessage: 'The long running request has been started',
progressMessage: 'Working on long running script – {{ percent }} %',
//success notification
successTitle: 'Successfully executed a long running script!',
successMessage: '{{objectName}} was successful',
successLinkText: 'Bing',
successLink: 'http://www.bing.com',
successLinkType: NotificationLinkType.Absolute,
//error notification
errorTitle: 'Failed to execute long running script',
errorMessage: 'Error: {{ message }}'
nodeRequestOptions: {
logAudit: true,
logTelemetry: true
}
};
return this.appContextService.workItem.submit('{!TargetNode}', workItem);
Note
İlerleme durumunun gösterilmesi için Write-Progress yazdığınız betikte yer almalıdır. Örneğin:
Write-Progress -Activity ‘The script is almost done!' -percentComplete 95
WorkItem Seçenekleri
| function | Explanation |
|---|---|
| submit() | İş öğesini gönderir |
| submitAndWait() | Görev öğesini gönderin ve yürütmenin tamamlanmasını bekleyin. |
| wait() | Mevcut iş öğesinin tamamlanmasını bekleyin |
| query() | Var olan bir iş öğesini kimlikle sorgulama |
| find() | Mevcut iş öğesini, TargetNodeName, ModuleName veya typeId ile bulun. |
PowerShell Batch API'leri
Aynı betiği birden çok düğümde çalıştırmanız gerekiyorsa toplu PowerShell oturumu kullanılabilir. Örneğin:
const batchSession = this.appContextService.powerShell.createBatchSession(
['{!TargetNode1}', '{!TargetNode2}', sessionKey);
this.appContextService.powerShell.runBatchSingleCommand(batchSession, command).subscribe((responses: PowerShellBatchResponseItem[]) => {
for (const response of responses) {
if (response.error || response.errors) {
//handle error
} else {
const results = response.properties && response.properties.results;
//response.nodeName
//results[0]
}
}
},
Error => { /* handle error */ });
PowerShellBatch seçenekleri
| option | Explanation |
|---|---|
| runSingleCommand | Dizideki tüm düğümlerde tek bir komut çalıştırma |
| run | Eşleştirilmiş düğümde karşılık gelen komutu çalıştırma |
| cancel | Dizideki tüm düğümlerde komutu iptal etme |