Voorbeeld GetProcessSample04
In dit voorbeeld ziet u hoe u een cmdlet implementeert waarmee de processen op de lokale computer worden opgehaald. Er wordt een niet-afsluitfout gegenereerd als er een fout optreedt tijdens het ophalen van een proces. Deze cmdlet is een vereenvoudigde versie van de Get-Process
cmdlet geleverd door Windows PowerShell 2.0.
Het voorbeeld bouwen met Visual Studio
Wanneer de Windows PowerShell 2.0 SDK is geïnstalleerd, gaat u naar de map GetProcessSample04. De standaardlocatie is
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0\Samples\sysmgmt\WindowsPowerShell\csharp\GetProcessSample04
.Dubbelklik op het pictogram voor het oplossingsbestand (.sln). Hiermee opent u het voorbeeldproject in Visual Studio.
Selecteer in het menu BuildBuild Solution om de bibliotheek voor het voorbeeld te bouwen in de standaardmappen
\bin
of\bin\debug
.
Het voorbeeld uitvoeren
Maak de volgende modulemap:
[user]\Documents\WindowsPowerShell\Modules\GetProcessSample04
Kopieer de voorbeeldassembly naar de modulemap.
Start Windows PowerShell.
Voer de volgende opdracht uit om de assembly in Windows PowerShell te laden:
Import-Module getprossessample04
Voer de volgende opdracht uit om de cmdlet uit te voeren:
Get-Proc
Vereisten
Voor dit voorbeeld is Windows PowerShell 2.0 vereist.
Demonstreert
In dit voorbeeld ziet u het volgende.
Een cmdlet-klasse declareren met behulp van het kenmerk Cmdlet.
Een cmdlet-parameter declareren met behulp van het parameterkenmerk.
De positie van de parameter opgeven.
Opgeven dat de parameter invoer uit de pijplijn neemt. De invoer kan worden opgehaald uit een object of een waarde van een eigenschap van een object waarvan de eigenschapsnaam hetzelfde is als de parameternaam.
Het declareren van een validatiekenmerk voor de parameterinvoer.
Het vastlopen van een niet-afsluitfout en het schrijven van een foutbericht naar de foutstroom.
Voorbeeld
In dit voorbeeld ziet u hoe u een cmdlet maakt waarmee niet-afsluitfouten worden verwerkt en foutberichten naar de foutstroom worden geschreven.
namespace Microsoft.Samples.PowerShell.Commands
{
using System;
using System.Diagnostics;
using System.Management.Automation; // Windows PowerShell namespace.
#region GetProcCommand
/// <summary>
/// This class implements the Get-Proc cmdlet.
/// </summary>
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
{
#region Parameters
/// <summary>
/// The names of the processes to act on.
/// </summary>
private string[] processNames;
/// <summary>
/// Gets or sets the list of process names on
/// which the Get-Proc cmdlet will work.
/// </summary>
[Parameter(
Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true)]
[ValidateNotNullOrEmpty]
public string[] Name
{
get { return this.processNames; }
set { this.processNames = value; }
}
#endregion Parameters
#region Cmdlet Overrides
/// <summary>
/// The ProcessRecord method calls the Process.GetProcesses
/// method to retrieve the processes specified by the Name
/// parameter. Then, the WriteObject method writes the
/// associated processes to the pipeline.
/// </summary>
protected override void ProcessRecord()
{
// If no process names are passed to cmdlet, get all
// processes.
if (this.processNames == null)
{
WriteObject(Process.GetProcesses(), true);
}
else
{
// If process names are passed to the cmdlet, get and write
// the associated processes.
// If a non-terminating error occurs while retrieving processes,
// call the WriteError method to send an error record to the
// error stream.
foreach (string name in this.processNames)
{
Process[] processes;
try
{
processes = Process.GetProcessesByName(name);
}
catch (InvalidOperationException ex)
{
WriteError(new ErrorRecord(
ex,
"UnableToAccessProcessByName",
ErrorCategory.InvalidOperation,
name));
continue;
}
WriteObject(processes, true);
} // foreach (string name...
} // else
} // ProcessRecord
#endregion Overrides
} // End GetProcCommand class.
#endregion GetProcCommand
}