Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Laten we dieper ingaan op de Windows Admin Center Extensions SDK - laten we het hebben over het toevoegen van PowerShell-opdrachten aan uw extensie.
PowerShell in TypeScript
Het proces voor het bouwen van gulp heeft een genereerstap die alles {!ScriptName}.ps1
wat in de \src\resources\scripts
map is geplaatst, neemt en deze in de powershell-scripts
klasse onder de \src\generated
map inbouwt.
Opmerking
Werk de powershell-scripts.ts
strings.ts
bestanden niet handmatig bij. Elke wijziging die u aanbrengt, wordt overschreven bij de volgende generatie.
Een PowerShell-script uitvoeren
Alle scripts die u op een knooppunt wilt uitvoeren, kunnen in \src\resources\scripts\{!ScriptName}.ps1
.
Belangrijk
Wijzigingen die in een {!ScriptName}.ps1
bestand worden aangebracht, worden pas in uw project doorgevoerd nadat gulp generate
ze zijn uitgevoerd.
De API werkt door eerst een PowerShell-sessie te maken op de knooppunten waarop u zich richt, het PowerShell-script te maken met alle parameters die moeten worden doorgegeven en vervolgens het script uit te voeren op de sessies die zijn gemaakt.
We hebben bijvoorbeeld dit script \src\resources\scripts\Get-NodeName.ps1
:
Param
(
[String] $stringFormat
)
$nodeName = [string]::Format($stringFormat,$env:COMPUTERNAME)
Write-Output $nodeName
We maken een PowerShell-sessie voor ons doelknooppunt:
const session = this.appContextService.powerShell.createSession('{!TargetNode}');
Vervolgens maken we het PowerShell-script met een invoerparameter:
const command = PowerShell.createCommand(PowerShellScripts.Get_NodeName, {stringFormat: 'The name of the node is {0}!'});
Ten slotte moeten we dat script uitvoeren in de sessie die we hebben gemaakt:
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()
}
Nu moeten we ons abonneren op de waarneembare functie die we zojuist hebben gemaakt. Plaats dit op een plaats waar u de functie moet aanroepen om het PowerShell-script uit te voeren:
this.getNodeName().subscribe(
response => {
console.log(response)
}
);
Door de knooppuntnaam op te geven aan de createSession-methode, wordt een nieuwe PowerShell-sessie gemaakt, gebruikt en vervolgens onmiddellijk vernietigd na voltooiing van de PowerShell-aanroep.
Belangrijkste opties
Er zijn enkele opties beschikbaar bij het aanroepen van de PowerShell-API. Elke keer dat een sessie wordt gemaakt, kan deze met of zonder sleutel worden gemaakt.
Sleutel: Dit creëert een gecodeerde sessie die kan worden opgezocht en hergebruikt, zelfs tussen componenten (wat betekent dat Component 1 een sessie kan maken met belangrijke "SME-ROCKS" en Component 2 dezelfde sessie kan gebruiken). Als er een sleutel is opgegeven, moet de sessie die wordt gemaakt, worden verwijderd door dispose() aan te roepen, zoals in het bovenstaande voorbeeld is gedaan. Een sessie mag niet langer dan 5 minuten worden bewaard zonder te zijn weggegooid.
const session = this.appContextService.powerShell.createSession('{!TargetNode}', '{!Key}');
Keyless: Er wordt automatisch een sleutel aangemaakt voor de sessie. Deze sessie wordt na 3 minuten automatisch afgevoerd. Door keyless te gebruiken, kan uw extensie het gebruik van alle runspace die al beschikbaar is op het moment van het maken van een sessie recyclen. Als er geen runspace beschikbaar is, wordt er een nieuwe gemaakt. Deze functionaliteit is goed voor eenmalige oproepen, maar herhaald gebruik kan de prestaties beïnvloeden. Het duurt ongeveer 1 seconde om een sessie te maken, dus het continu recyclen van sessies kan vertragingen veroorzaken.
const session = this.appContextService.powerShell.createSession('{!TargetNodeName}');
of
const session = this.appContextService.powerShell.createAutomaticSession('{!TargetNodeName}');
In de meeste situaties maakt u een gecodeerde sessie in de ngOnInit()
methode en verwijdert u deze vervolgens in ngOnDestroy()
. Volg dit patroon wanneer er meerdere PowerShell-scripts in een onderdeel zijn, maar de onderliggende sessie NIET wordt gedeeld tussen onderdelen.
Voor de beste resultaten moet u ervoor zorgen dat het maken van sessies wordt beheerd in componenten in plaats van services - dit helpt ervoor te zorgen dat de levensduur en het opschonen goed kunnen worden beheerd.
Voor de beste resultaten moet u ervoor zorgen dat het maken van sessies wordt beheerd in componenten in plaats van services - dit helpt ervoor te zorgen dat de levensduur en het opschonen goed kunnen worden beheerd.
PowerShell-stroom
Als u een langlopend script hebt en de gegevens geleidelijk worden uitgevoerd, kunt u met een PowerShell-stream de gegevens verwerken zonder dat u hoeft te wachten tot het script is voltooid. De observabele next() wordt aangeroepen zodra de gegevens zijn ontvangen.
this.appContextService.powerShellStream.run(session, script);
Langlopende scripts
Als u een langlopend script hebt dat u op de achtergrond wilt uitvoeren, kan een werkitem worden ingediend. De status van het script wordt gevolgd door de gateway en updates van de status kunnen naar een melding worden verzonden.
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);
Opmerking
Om de voortgang te laten zien, moet Write-Progress zijn opgenomen in het script dat u hebt geschreven. Voorbeeld:
Write-Progress -Activity ‘The script is almost done!' -percentComplete 95
Opties voor werkitems
functie | Uitleg |
---|---|
indienen() | Verzendt het werkitem |
submitAndWait() | Dien het werkitem in en wacht tot de uitvoering is voltooid |
wachten() | Wachten tot het bestaande werkitem is voltooid |
query() | Query voor een bestaand werkitem op id |
vinden() | Zoek een bestaand werkitem op basis van de TargetNodeName, ModuleName of typeId. |
PowerShell Batch-API's
Als u hetzelfde script op meerdere knooppunten moet uitvoeren, kunt u een batch-PowerShell-sessie gebruiken. Voorbeeld:
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-opties
optie | Uitleg |
---|---|
runSingleCommand uitvoeren | Voer één opdracht uit op alle knooppunten in de matrix |
rennen | Voer de bijbehorende opdracht uit op het gekoppelde knooppunt |
Annuleren | Annuleer de opdracht op alle knooppunten in de array |