Delen via


PowerShell gebruiken in uw extensie

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.tsstrings.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