Windows PowerShell: Usando cmdlets em scripts

Don Jones

Um dos novos recursos interessantes do Windows PowerShell v2 é a capacidade de escrever funções bastante aprimoradas. Essas funções, escritas inteiramente em script, têm os mesmos recursos de um cmdlet “ real ” escrito em translation from VPE for Csharp ou no Visual Basic e compilados no Visual Studio. Essas funções avançadas de (they were originally called “script cmdlets” early in the v2 development cycle) escrever funções mais flexíveis do que você pode usar perfeitamente juntamente com os cmdlets regular.

É tudo na ligação

A diferença entre uma função simples e um cmdlet completo é cmdlets oferecem suporte a ligações de parâmetro poderoso. Você pode usar a parâmetros posicionais, denominado parâmetros, parâmetros obrigatórios e até mesmo fazer verificações de validação de parâmetro básica — tudo isso descrevendo simplesmente o parâmetro para o shell. Eis um exemplo:

Implementar seus próprios módulos

Como isso ajuda você distribuir seus scripts com mais facilidade? O segundo tipo de módulo, um módulo de script , é a resposta. Isso é simplesmente um normal script Windows PowerShell, com uma extensão de nome de arquivo .psm1 em vez de extensão de nome de arquivo. ps1 usual. Colocar mymodule.psm1 para a pasta \modules permite que você execute do MyModule do módulo de importação e o script será executado.

Normalmente, um módulo de script é composto por inteiramente das funções. Ou seja, quando o módulo é importado, nada é realmente executado — as funções dentro do módulo de script são carregadas no shell e ficam disponíveis em todo o shell. Suponha que você tenha um módulo de script que pode ter esta aparência:

function Get-Inventory {
    [CmdletBinding()]
    param (
        [parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string[]]$computername,
        
        [parameter(Mandatory=$false)]
        [alias("PF")]
        [switch]$pingfirst,
        
        [parameter(Mandatory=$true,Position=0)]
        [AllowEmptyString()]
        [string]$class
        
    )
    PROCESS {
    }
}

Nesta instrução, eu já declarado três parâmetros:

  • nome do computador é uma única cadeia de caracteres ou uma matriz de cadeias de caracteres. É obrigatório e ele aceita a seqüência de caracteres de entrada do pipeline – ou seja, se canalizar em um grupo de seqüências de caracteres, que vai ser automaticamente solto variável nome_do_computador $.
  • pingfirst não é obrigatória, mas se for usado, você deve usar o opção - alias PP. Ele irá salvar digitando um pouco. Este é um parâmetro de opção, significando que ele não aceita um valor. Ele está ativado ou desativado.
  • classe também é obrigatória, mas Don ’t ainda é necessário digitar o nome do parâmetro-classe. Só atribua a ele o valor apropriado como o valor da primeira posição quando você executa a função. Embora seja obrigatório, ele aceitará uma seqüência vazia.

Existem muitos atributos mais — e muitos dos exemplos — na Ajuda on-line. Execute o ajudar about_Functions_Advanced_Parameters para ver todas elas.

Acessando parâmetros Common

O shell define vários parâmetros comuns compartilhados por todos os cmdlets. Um deles é - modo detalhado, que se destina a informar um cmdlet para saber mais sobre que o normal o que está fazendo de saída. No entanto, a seguinte definição de função irá resultar em um erro:

function Test-Something {
    [CmdletBinding()]
    param (
        [switch]$verbose
    )
    PROCESS {
    }
}

Isso ocorre porque não é possível Redefina um dos parâmetros comuns como - verbose. Mas como saber se a função foi executada com a opção - detalhada ou não? Bem, acontece a ser desnecessário. O Windows PowerShell mantém registro de-lo para você. Você simplesmente chamar o de Write-Verbose e o Windows PowerShell irá ignorar essas chamadas se - verbose não foi usado:

function Test-Something {
    PROCESS {
        Write-Verbose "Starting cmdlet"
    }
}

test-something –verbose

Confirmação de impacto

Outro par de parâmetros comuns é - whatif e confirme. Qualquer cmdlet faz algum tipo de alteração para o computador deve para reconhecer os. Dar a opção de ter o cmdlet para exibir o que ele faria normalmente (-whatif), ou fazer com que ele individualmente confirmar cada ação (- Confirmar). Juntos, esses parâmetros são chamados ShouldProcess, e você pode declarar uma função que oferece suporte a eles, como mostrado aqui:

function Delete-Things {
    [CmdletBinding(
        SupportsShouldProcess=$true,
        ConfirmImpact="Medium"
    )]
    PROCESS {
    }
}

Essa declaração permite que ambos - whatif e confirmar como parâmetros para sua função. Ela também especifica que a função tem um nível de impacto "Médio" no sistema operacional. Existem há diretrizes estritas para o que significa "Médio" — que eu poderia imaginar algo menos a possibilidade do desastre total. O truque real é a variável de ConfirmPreference $ do shell padrão é para "Alta". Quando o impacto de um cmdlet é menor que $ ConfirmPreference, e em seguida, o cmdlet será executada sem confirmação, a menos que - whatif - confirmação ou sejam especificados.

Se o impacto do cmdlet seja igual ou maior que $ ConfirmPreference, toda vez que executar o cmdlet, ele atuará como se tivesse especificado - confirmar, mesmo se você esqueceu de fazê-lo. Portanto, se sua função é fazer algo realmente perigoso, de especificar um ConfirmImpact = "Alto" para que seu cmdlet sempre irá solicitar a confirmação. As outras opções são "Nenhum" e "Low".

Nenhuma ajuda interna do shell, na verdade, mostra como pedir confirmação — e não é automática. A Ajuda refere-se a Ajuda online do MSDN, que é destinada a desenvolvedores translation from VPE for picture itExclMark translation from VPE for picture itExclMark Framework e não fazer referência a linguagem de scripts do shell em todos os. Portanto, mostrarei aqui:

function Delete-Things {
    [CmdletBinding(
        SupportsShouldProcess=$true,
        ConfirmImpact="High"
    )]
    Param ($param1)
    PROCESS {
        if ($pscmdlet.ShouldProcess($param1)) {
            Write "Deleting..."
        }
    }
}

Delete-Things "organizationalunit"

pscmdlet $ é uma variável interna, você pode usar dentro do bloco de scripts PROCESS, a funcionalidade no nível do cmdlet acesso — incluindo o método ShouldProcess. Você passa uma descrição do qual você está prestes a modificar e o shell serão cuidam de exibir a confirmação real ou “ se ” da mensagem.

Se ShouldProcess retornar $ True, e em seguida, permite que você continue. Se ela retornará $ false, em seguida, você não deve fazer tudo o que é você fosse fazer. Se você souber sobre a variável de pscmdlet $, é mais fácil entender esses documentos de desenvolvedor do MSDN. Eles descreve precisamente as diferentes maneiras, você deve usar ShouldProcess e seus programas — como ShouldContinue.

Ajudem-me! Ajudem-me! Ajudem-me!

Não se esqueça de que funciona — até mesmo avançado aquelas — pode conter sua própria ajuda interna em comentários especialmente formatadas, como descrevi na minha coluna de março 2010 . Em geral, eu listar a Ajuda do comentário em primeiro lugar, em seguida, a instrução de CmdletBinding Meus parâmetros e a {} BEGIN, PROCESS a {} e END scriptblocks {}. Sempre uma boa idéia incluir ajuda dentro de suas funções é — nunca se sabe quem pode se beneficiar com ele.

Se você já escreveu pipeline funciona antes de (também chamado “ funções de filtragem ”), em seguida, você já sabe tudo o mais que preciso saber para escrever “ cmdlet do script ”. O bloco de scripts PROCESS {} é onde entra o código, e ele será executado uma vez para cada objeto enviada por pipe para o seu cmdlet. Também é tudo o mais sobre essas funções avançadas como suas contrapartes um pouco mais simples.

Windows PowerShell v2 está disponível agora

Embora fornecido pré-instalados com o Windows Server 2008 R2 e o Windows 7, o Windows PowerShell v2 — e seus componentes de estrutura de gerenciamento complementares — está disponível para o Windows XP, Windows Server 2003, Windows Vista e Windows Server 2008. Visite support.microsoft.com/kb/968929 de para obter o link de download para qualquer sistema operacional você está usando. Isso deve ser compatível com seus scripts v1 e todas as minhas colunas futuras assumirá que você está usando o 2. 0.

Um intervalo de audiências

A equipe do Windows PowerShell corretamente orgulha-se em tornar o Windows PowerShell úteis para uma ampla variedade de públicos-alvo com vários níveis de habilidade. Funções avançadas, sem dúvida, são um exemplo de algo que somente um público de avançada da serão úteis.

Se você estiver apenas começando a usar o shell e para lembrá-lo para executar o de Ajuda, em seguida, funções avançadas são provavelmente ainda desligado no futuro. Com êxito, você pode usar o shell sem nunca escrever uma função avançada. Depois de iniciar a obtenção de mais avançados e começar a escrever componentes reutilizáveis, você descobrirá que funções avançadas são uma ótima maneira de fazê-lo.

De postagem de blog do aqui é um ótimo exemplo disso: Ele começa com um simples comando realiza uma tarefa importante — algo que qualquer administrador pode escrever. Em seguida, o autor gradualmente amplia a funcionalidade do seu comando em uma função, uma função de filtragem e, finalmente, uma função avançada, mostrando como o shell pode ser dimensionado conforme suas necessidades e habilidades crescem.

Don Jones é um fundador da Concentrated Technology e perguntas de respostas sobre o Windows PowerShell e outras tecnologias em ConcentratedTech.com. Ele também é autor de Nexus.Realtimepublishers.com, que disponibiliza muitos de seus livros como livres edições eletrônicas.

Conteúdo relacionado

·      Windows PowerShell: De Active Directory e do PowerShell

·      Windows PowerShell: À esquerda, à direita do formato de filtro

·      Windows PowerShell: Fique posicionada