Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przyjrzyjmy się bardziej szczegółowo zestawowi SDK rozszerzeń centrum administracyjnego systemu Windows — porozmawiajmy o dodawaniu poleceń programu PowerShell do rozszerzenia.
Program PowerShell w języku TypeScript
Proces budowania gulp ma krok generowania, który zajmie się dowolnymi plikami {!ScriptName}.ps1 umieszczonymi w folderze \src\resources\scripts i zbuduje je w klasie powershell-scripts w folderze \src\generated.
Note
Nie aktualizuj ręcznie ani powershell-scripts.ts, ani strings.ts plików. Wszelkie zmiany, które wprowadzisz, zostaną zastąpione podczas następnego generowania.
Uruchamianie skryptu programu PowerShell
Wszystkie skrypty, które mają być uruchamiane w węźle, można umieścić w pliku \src\resources\scripts\{!ScriptName}.ps1.
Important
Wszelkie zmiany wprowadzone w pliku {!ScriptName}.ps1 nie będą widoczne w projekcie do czasu uruchomienia gulp generate.
Interfejs API działa przez najpierw utworzenie sesji programu PowerShell w węzłach docelowych, utworzenie skryptu programu PowerShell z dowolnymi parametrami, które należy przekazać, a następnie uruchomienie skryptu w utworzonych sesjach.
Na przykład mamy ten skrypt \src\resources\scripts\Get-NodeName.ps1:
Param
(
[String] $stringFormat
)
$nodeName = [string]::Format($stringFormat,$env:COMPUTERNAME)
Write-Output $nodeName
Utworzymy sesję programu PowerShell dla naszego węzła docelowego:
const session = this.appContextService.powerShell.createSession('{!TargetNode}');
Następnie utworzymy skrypt programu PowerShell z parametrem wejściowym:
const command = PowerShell.createCommand(PowerShellScripts.Get_NodeName, {stringFormat: 'The name of the node is {0}!'});
Na koniec musimy uruchomić ten skrypt w utworzonej sesji:
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()
}
Teraz musimy zasubskrybować funkcję obserwowalną, którą właśnie utworzyliśmy. Umieść to miejsce, w którym należy wywołać funkcję, aby uruchomić skrypt programu PowerShell:
this.getNodeName().subscribe(
response => {
console.log(response)
}
);
Podając nazwę węzła metodzie createSession, zostanie utworzona, użyta nowa sesja programu PowerShell, a następnie natychmiast zniszczona po zakończeniu wywołania programu PowerShell.
Opcje klucza
Podczas wywoływania interfejsu API programu PowerShell jest dostępnych kilka opcji. Za każdym razem, gdy sesja jest tworzona, może być utworzona z kluczem lub bez niego.
Klucz: Spowoduje to utworzenie sesji z kluczami, które można wyszukać i użyć ponownie, nawet we wszystkich składnikach (co oznacza, że składnik 1 może utworzyć sesję z kluczem "SME-ROCKS", a składnik 2 może używać tej samej sesji). Jeśli zostanie podany klucz, utworzona sesja musi zostać usunięta przez wywołanie metody dispose(), tak jak zostało to zrobione w powyższym przykładzie. Sesja nie powinna być przechowywana bez usuwania przez ponad 5 minut.
const session = this.appContextService.powerShell.createSession('{!TargetNode}', '{!Key}');
Keyless: Klucz zostanie utworzony automatycznie dla sesji. Ta sesja jest usuwana automatycznie po 3 minutach. Użycie bezkluczowe pozwala rozszerzeniu na ponowne wykorzystanie dowolnej przestrzeni uruchomieniowej, która jest już dostępna w momencie tworzenia sesji. Jeśli nie ma dostępnego obszaru uruchomieniowego, zostanie utworzony nowy. Ta funkcja jest dobra w przypadku jednorazowych wywołań, ale wielokrotne użycie może mieć wpływ na wydajność. Sesja zajmuje około 1 sekundy do utworzenia, więc ciągłe odtwarzanie sesji może spowodować spowolnienie.
const session = this.appContextService.powerShell.createSession('{!TargetNodeName}');
or
const session = this.appContextService.powerShell.createAutomaticSession('{!TargetNodeName}');
W większości sytuacji utwórz sesję z kluczem w metodzie ngOnInit(), a następnie zakończ ją w ngOnDestroy(). Postępuj zgodnie z tym wzorcem, jeśli składnik zawiera wiele skryptów PowerShell, ale podstawowa sesja nie jest dzielona między składnikami.
Aby uzyskać najlepsze wyniki, upewnij się, że tworzenie sesji jest zarządzane wewnątrz składników, a nie usług — pomaga to zapewnić prawidłowe zarządzanie okresem istnienia i czyszczeniem.
Aby uzyskać najlepsze wyniki, upewnij się, że tworzenie sesji jest zarządzane wewnątrz składników, a nie usług — pomaga to zapewnić prawidłowe zarządzanie okresem istnienia i czyszczeniem.
Strumień programu PowerShell
Jeśli masz długotrwały skrypt i dane są wyświetlane stopniowo, strumień programu PowerShell umożliwia przetwarzanie danych bez konieczności oczekiwania na zakończenie skryptu. Obserwowalne next() będzie wywoływane natychmiast po otrzymaniu danych.
this.appContextService.powerShellStream.run(session, script);
Długotrwałe skrypty
Jeśli masz długotrwały skrypt, który chcesz uruchomić w tle, można przesłać element roboczy. Stan skryptu będzie śledzony przez Gateway, a aktualizacje stanu mogą być wysyłane jako powiadomienia.
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
Aby można było wyświetlić postęp, Write-Progress należy dołączyć do napisanego skryptu. Przykład:
Write-Progress -Activity ‘The script is almost done!' -percentComplete 95
Opcje elementu roboczego
| funkcja | Explanation |
|---|---|
| submit() | Przesyła element roboczy |
| submitAndWait() | Prześlij element roboczy i poczekaj na ukończenie jego wykonywania |
| wait() | Poczekaj na ukończenie istniejącego elementu roboczego |
| query() | Zapytanie dotyczące istniejącego elementu roboczego według identyfikatora |
| find() | Znajdź istniejący element roboczy według TargetNodeName, ModuleName lub typeId. |
Interfejsy API Batch programu PowerShell
Jeśli musisz uruchomić ten sam skrypt w wielu węzłach, można użyć sesji programu PowerShell wsadowej. Przykład:
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 */ });
Opcje programu PowerShellBatch
| option | Explanation |
|---|---|
| runSingleCommand | Wykonaj pojedyncze polecenie na wszystkich węzłach w tablicy |
| przebieg | Uruchom odpowiednie polecenie w sparowanym węźle |
| cancel | Anuluj polecenie na wszystkich węzłach tablicy |