Windows PowerShell: Creazione di una funzione migliore

Le funzioni avanzate di Windows PowerShell 2.0 consentono di emulare cmdlet nativi con uno script relativamente semplice.

Don Jones

Windows PowerShell 2.0, Microsoft ha introdotto un nuovo tipo di funzione denominata un "funzioni avanzate". Molte persone lo chiama un cmdlet di script"." L'idea con queste funzioni è che ora è possibile utilizzare il linguaggio di script semplificato di Windows PowerShell per creare qualcosa che sia, works, smells e l'aspetto quasi esattamente un cmdlet Windows PowerShell reale, nativo.

Ovviamente, non tutti si saranno in grado di creare strumenti riutilizzabili per sé e per i collaboratori. Tuttavia, se si siano creando strumenti riutilizzabili, queste funzioni avanzate sono l'unico modo per passare. In effetti, attualmente sto modifica mio corsi in aula solo insegnare questo tipo di funzione di questo tipo.

Perché funzioni avanzate di lavoro problema molto simile cmdlet reale, una funzione eseguita correttamente può essere più semplice ad altri utenti di utilizzare, in quanto "rientri" con il modo in cui il resto dei lavori della shell. In caso, un modello che è possibile eseguire più rapidamente creare queste funzioni avanzate:

function Get-Something {
  <#
  .SYNOPSIS
  Describe the function here
  .DESCRIPTION
  Describe the function in more detail
  .EXAMPLE
  Give an example of how to use it
  .EXAMPLE
  Give another example of how to use it
  .PARAMETER computername
  The computer name to query. Just one.
  .PARAMETER logname
  The name of a file to write failed computer names to. Defaults to errors.txt.
  #>
  [CmdletBinding()]
  param
  (
    [Parameter(Mandatory=$True,
    ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True,
      HelpMessage='What computer name would you like to target?')]
    [Alias('host')]
    [ValidateLength(3,30)]
    [string[]]$computername,
        
    [string]$logname = 'errors.txt'
  )

  begin {
  write-verbose "Deleting $logname"
    del $logname -ErrorActionSilentlyContinue
  }

  process {

    write-verbose "Beginning process loop"

    foreach ($computer in $computername) {
      Write-Verbose "Processing $computer"
      # use $computer to target a single computer
    

      # create a hashtable with your output info
      $info = @{
        'info1'=$value1;
        'info2'=$value2;
        'info3'=$value3;
        'info4'=$value4
      }
      Write-Output (New-Object –TypenamePSObject –Prop $info)
    }
  }
}

Esistono alcuni punti importanti da notare in questa funzione, molti dei quali sarà necessario modificare quando si utilizza questo modello:

  • Il nome della funzione dovrebbe apparire come un nome di cmdlet, a partire da uno dei verbi comunemente utilizzati Windows PowerShell come "Get" e terminano con un sostantivo singolare.
  • Compilare le informazioni della Guida basati su commento. Fornire una descrizione di ciascun parametro, una descrizione della funzione globale e alcuni esempi di utilizzo. Eseguire about_comment_based_help della Guida in linea per ulteriori informazioni sulla scrittura di Guida in linea in questo modo.
  • Il primo parametro NomeComputer $, è piuttosto complesso. Può accettare uno o più valori del parametro o dalla tubazione. Accetta solo valori che sono composti da tre a 30 caratteri. Quando si esegue la funzione, è possibile utilizzare –host anziché –computername. Questo parametro è obbligatorio. Se un utente viene eseguita la funzione senza fornire un nome di computer, la shell verrà richiesto di immettere una o più.
  • Il secondo parametro logname $, è un parametro più semplice. Accetta solo un valore di stringa. Include inoltre un valore predefinito.
  • Il blocco di script BEGIN tenta di eliminare qualsiasi file di log esistenti, in modo che ogni esecuzione della funzione dispone di un file di registro fresche.
  • All'interno del blocco di script del processo, ho indicato dove si utilizzerebbe variabile $computer per utilizzare la funzione per lavorare con un singolo computer. Non si opera con nomecomputer $ direttamente. Tale parametro può contenere uno o più valori, in modo che il ciclo ForEach li enumera e inserisce solo uno alla volta nel computer di $ per voi.
  • $Info hashtable deve contenere il formato di output desiderato. È possibile scegliere output in formato tabulare. Ho creato colonne denominate info1, info2, info3 e info4. I valori per le colonne vengono estratti dalle variabili $valoreX. Questo è solo un esempio. Non ho effettivamente inserire nulla in tali variabili nel modello corrente, in modo che è possibile sostituire $valore1, valore2 $ e così via con le proprie informazioni.

Questo modello è ideale per tutte le funzioni avanzate che è necessario ottenere informazioni ma non effettivamente apportare modifiche allo stato del sistema. Per le funzioni avanzate che cambieranno lo stato del sistema, è necessario implementare alcuni elementi aggiuntivi. Questo motivo, ecco un secondo modello:

function Do-Something {
  <#
  .SYNOPSIS
  Describe the function here
  .DESCRIPTION
  Describe the function in more detail
  .EXAMPLE
  Give an example of how to use it
  .EXAMPLE
  Give another example of how to use it
  .PARAMETER computername
  The computer name to query. Just one.
  .PARAMETER logname
  The name of a file to write failed computer names to. Defaults to errors.txt.
  #>
  [CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='Low')]
  param
  (
    [Parameter(Mandatory=$True,
    ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True,
      HelpMessage='What computer name would you like to target?')]
    [Alias('host')]
    [ValidateLength(3,30)]
    [string[]]$computername,
        
    [string]$logname = 'errors.txt'
  )

  begin {
  write-verbose "Deleting $logname"
    del $logname -ErrorActionSilentlyContinue
  }

  process {

    write-verbose "Beginning process loop"

    foreach ($computer in $computername) {
      Write-Verbose "Processing $computer"
      if ($pscmdlet.ShouldProcess($computer)) {
        # use $computer here
      }
    }
  }
}

In questo modello, è necessario modificare l'impostazione "ConfirmImpact". È necessario fornire un'indicazione relativa del potenziale pericolo di una funzione avanzata. Qualcosa secondaria come modificare l'attributo di sola lettura del file, ad esempio, potrebbe classificare un ConfirmImpact di "Bassa". Il riavvio del computer potrebbe essere un ConfirmImpact di "Alta". Windows PowerShell questa impostazione, insieme con incorporata $ConfirmPreference variabile della shell viene utilizzata per determinare se fornire automaticamente richieste di conferma "Si sicuri?" quando si esegue la funzione.

La Commissione ha riscontrato in cui si KeyFrames dovrà eseguire l'operazione, utilizzare $ del computer per un singolo computer di destinazione. Che viene eseguito il wrapping in un costrutto "If", viene utilizzato l'oggetto pscmdlet $ incorporato. Se questa funzione viene eseguita con i parametri – Confirm o –whatif (che supporterà), l'oggetto pscmdlet $ si occuperà di produrre l'output di "what if" o la generazione di richieste di conferma "Si sicuri?".

Entrambi questi modelli verranno supporta il parametro –verbose e utilizzare Write-Verbose per generare messaggi di stato durante l'esecuzione della funzione. Ovviamente, non tutte le funzioni saranno necessario ai computer di destinazione. È opportuno in alcuni casi, i parametri per accettare i nomi di file, i nomi utente o altre informazioni. È sufficiente modificare le dichiarazioni dei parametri in modo appropriato.

È possibile trovare ulteriori informazioni sugli attributi del parametro, ad esempio la convalida obbligatoria, pipeline input e così via, ovvero tramite l'esecuzione di Guida in linea di about_functions_advanced_parameter nella shell. Buon lavoro.

Don Jones

Don Jonesè diffuso Windows PowerShell autore, trainer e degli altoparlanti. Il suo libro più recente è serate "informazioni su Windows PowerShell in un mese di con" (Manning 2011); visitate MoreLunches.com per info e libero companion contenuto. Egli è disponibile anche per corsi di formazione on-site (visitare ConcentratedTech.com/training per ulteriori informazioni).

Contenuto correlato