Do Windows PowerShell: Curso rápido de scripts

Esta abrangente coluna sobre o Windows PowerShell o introduzirá a essa poderosa tecnologia.

Don Jones

Mais de vocês são acostumar Windows PowerShell e concretizar suas vantagens.Com isso em mente, coluna deste mês vai ser um longo.Esta é uma visão geral sobre lightning Windows PowerShell script, incluindo como criar scripts com parâmetros.Nos próximos meses, falarei sobre tópicos específicos que se baseiam nessa base.

Se você não esteja habituado a executar os comandos de Windows PowerShell no console, você pode encontrar essa muito avançada, mas tentar vasculhar assim mesmo.Você deve ter uma compreensão completa dos recursos de segurança Windows PowerShell.Você já deve saber sobre a diretiva de execução e saber qual configuração você está usando.Se você ainda não saiba a diferença entre "RemoteSigned" e "AllSigned" e por que um pode ser melhor do que o outro, você talvez não esteja pronta para o material a seguir.

Você também deve saber como executar scripts no shell e deve se lembrar de que você sempre deve fornecer um caminho e nome de arquivo para executar um script.Finalmente, você também deve saber a diferença entre executar um script no Integrated Scripting Environment (ISE) e no console.No ISE, os scripts são executados no escopo global.No console do shell normal, os scripts de obtém seu próprio escopo.Vamos analisar escopo, mas você já deve ter uma idéia do que significa e como funciona.

Se você não se bastante deleite, dar uma olhada no meu livro, "Saiba de Windows PowerShell em um mês de almoços" (Manning Publications, 2011) e o companion Web site da e veja se esses recursos podem ajudá-lo a construir uma base melhor.

Tente acompanhá-lo enquanto você lê essa coluna.Testar os exemplos.Se você digitar (ou copie e cole) os exemplos de script em Windows PowerShell ISE começando na linha 1, seus números de linha irá corresponder com os números de linha nas descrições.

Arquivos de Script Windows PowerShell

Um arquivo de script Windows PowerShell é nada mais que um arquivo de texto sem formatação que tenha um.Extensão de nome de arquivo ps1.O "1" não se refere a versão do Windows PowerShell, mas em vez disso, a versão do mecanismo do idioma.Windows PowerShell versão 1 e 2 use engine versão 1 do idioma.É por isso que as duas versões do shell são instalados em uma pasta de versão 1.0 em \Windows\System32\WindowsPowerShell.

Um script de Windows PowerShell não é exatamente como um arquivo em lotes de linha de comando e executar um script não é precisamente a mesma que executar os mesmos comandos na mesma seqüência.Por exemplo, abra uma janela de console e execute o seguinte, pressionando Enter após cada linha (Lembre-se não digite os números de linha):

Get-Service
Get-Process

Agora digite essas mesmas linhas exatas em um arquivo de script ou o script ISE, painel de edição e execute o script. Você obterá resultados de busca diferentes. Cada vez que você pressione a tecla Enter em Windows PowerShell, que você iniciar um novo pipeline. Quaisquer comandos que você digitou são executados desse pipeline único. No final do pipeline, o Windows PowerShell converte seu conteúdo em uma exibição de texto. Quando você executar os dois comandos no console do normal, tiver feito isso em duas tubulações distintas.

Windows PowerShell foi possível construir uma exibição exclusiva para cada conjunto de saída. Quando inserido em um script, no entanto, ambos os comandos executados no mesmo pipeline. O Windows PowerShell sistema de formatação não seja sofisticada o suficiente para construir a mesma exclusivo saída para dois conjuntos diferentes de resultados. Tente executar isso no console:

Get-Service;Get-Process

Esses resultados devem parecer igual, da mesma forma que quando você executou o script que contém esses dois comandos. Nesse caso, ambos os comandos executados em uma tubulação única. Isso é o que aconteceu quando você executou o script.

O upshot prático de todos os isso é que um script deve produzir apenas um tipo de saída. É uma má idéia devido em grande parte das limitações de sistema de formatação. Existem outras considerações. Você não quer um script despejando vários tipos de coisas no pipeline, ao mesmo tempo.

Concentrar nela como uma regra para tudo, que vamos abordar. Um script deve gerar um e somente um tipo de saída. A única exceção seria se ele é um script que está sendo usado como um repositório para várias funções. Nesse caso, cada função deve gerar um e somente um tipo de saída.

Variáveis

Pense em variáveis como uma caixa. Você pode colocar um ou mais itens, até mesmo coisas diferentes, nessa caixa. A caixa tem um nome e Windows PowerShell esse nome pode incluir em praticamente qualquer coisa. "Var" pode ser um nome de variável, como can "{minha variável}". No segundo exemplo, as primeiras chaves coloque um nome de variável que contém espaços, que é bastante feio. Como uma boa prática, siga os nomes de variáveis que incluem letras, números e sublinhados.

Usando o nome de uma variável faz referência a toda a "caixa". Se você deseja referenciar o conteúdo da caixa, adicionar um sinal de cifrão: $ var. Você verá com freqüência precedidas do sinal de dólar porque o objetivo de usar um é obter o conteúdo de variáveis de Windows PowerShell. É importante lembrar, no entanto, que o cifrão não é parte do nome da variável. Ele é simplesmente uma indicação para informar ao Windows PowerShell que você deseja que o conteúdo, em vez da própria caixa. Por exemplo:

$var = 'hello'
$number = 1
$numbers = 1,2,3,4,5,6,7,8,9

Esses exemplos mostram como colocar itens em uma variável usando o operador de atribuição (=). Esse último exemplo cria uma matriz, porque Windows PowerShell interpreta todas as listas separadas por ponto-e-vírgula como uma matriz ou coleção, de itens. O primeiro exemplo atribui a um objeto de seqüência de caracteres, com os caracteres na seqüência de caracteres entre aspas.

Há um aspecto de Windows PowerShell que pode confundir os novatos. Windows PowerShell não "compreender" qualquer significado, que você pode associar um nome de variável. Uma variável como nome_do_computador $ não "informa" shell do que a variável irá conter um nome de computador.

Da mesma forma, os números de $ não "informam" shell do que uma variável irá conter mais de um número. O shell não se importa se você usar um nome de variável no plural. A instrução

$numbers = 1

é igualmente válida para o shell, como está

$numbers = 'fred.'

Quando uma variável contém vários valores, no entanto, você pode usar uma sintaxe especial para acessar apenas uma única delas. Você usaria os números de $[0] como o primeiro item, números de $[1] é o segundo, números de $-[1] é a última, números de $-[2] é o último segundo e assim por diante.

Aspas

Como prática recomendada, use aspas para delimitar uma variável, a menos que tenha um motivo específico para fazer o contrário. Existem três instâncias específicas em que você desejaria usar aspas duplas.

A primeira é quando você precisa inserir o conteúdo de uma variável em uma seqüência de caracteres. Aspas duplas apenas, Windows PowerShell irá procurar o $ e supondo que tudo que vier depois $, até o primeiro caractere que é ilegal em um nome de variável, é um nome de variável. O conteúdo dessa variável irá substituir o nome da variável e o $:

$name = 'Don'
$prompt = "My name is $name"

O prompt $ agora conterá "meu nome é Don" porque o nome de $ será substituído com o conteúdo da variável. Esta é uma excelente dica para combinar seqüências de caracteres sem precisar concatená-las.

Aspas duplas, Windows PowerShell também procure seu caractere de escape, o backtick ou o acento e age de acordo. Aqui estão alguns exemplos:

$debug = "`$computer contains $computer"
$head = "Column`tColumn`tColumn"

No primeiro exemplo, o primeiro $ está sendo "perdida." Que remove seu significado especial como um acessador de variável. Se o computador de $ contido 'Servidor' em seguida, depuração de $ conteria "computador $ contém SERVER".

No segundo exemplo, ' t representa um caractere de tabulação horizontal, para que Windows PowerShell colocará uma guia entre cada coluna. Você pode ler sobre outros caracteres de escape especiais no shell do about_escape_characters tópico da Ajuda.

Por fim, use aspas duplas quando uma cadeia de caracteres deve conter aspas simples:

$filter1 = "name='BITS'"
$computer = 'BITS'
$filter2 = "name='$computer'"

Neste exemplo, a seqüência de caracteres literal é o nome = 'BITS'. As aspas duplas contêm todo o conteúdo. US $Filtro1 e US $Filtro2 acabam contendo exatamente a mesma coisa, mas a US $Filtro2 de chegar lá, usando o truque de substituição de variável de aspas duplas. Observe que apenas o conjunto mais externo de cotações, na verdade, é importante. As aspas simples dentro da seqüência não importam para Windows PowerShell. As aspas simples são caracteres literais apenas. Windows PowerShell não interpretá-los.

Variáveis e objetos membros

Tudo o que Windows PowerShell é um objeto. Até mesmo uma seqüência de caracteres simple como, por exemplo, "nome" é um objeto, do tipo System. String. Você pode canalizar qualquer objeto para Get-Member para ver seu nome de tipo (ou seja, o tipo de objeto que ele é), bem como seus membros, que inclui suas propriedades e métodos:

$var = 'Hello'
$var | Get-Member

Use um período após um nome de variável para informar o shell, "eu não quero acessar o objeto inteiro dentro dessa variável. Quero apenas uma das suas propriedades ou métodos de acesso." Após o período, forneça o nome de propriedade ou método.

Nomes de método são sempre seguidos de um conjunto de parênteses. Alguns métodos aceitam argumentos de entrada e aqueles vá dentro dos parênteses em uma lista separada por vírgulas. Outros métodos não requerem nenhum argumento, e então os parênteses vazios, mas não se esqueça dos parênteses:

$svc = Get-Service
$svc[0].
name
$name = $svc[1].
name
$name.length
$name.ToUpper()

Observe a linha dois. Ele é iniciado, acessando o primeiro item na variável $svc. O meio período, "eu não quero que todo o objeto. Queria apenas uma propriedade ou método." Isso acessa a propriedade de nome. A linha cinco ilustra como acessar um método, fornecendo seu nome após um período, seguido de parênteses.

Um período normalmente é um caractere inválido dentro de um nome de variável, porque o período significa que desejamos acessar uma propriedade ou método. Isso significa que a linha dois no exemplo a seguir não funciona da maneira que você poderia esperar:

$service = 'bits'
$name = "Service is $service.ToUpper()"
$upper = $name.ToUpper()
$name = "Service is $upper"

Na linha dois, $nome conterá "o serviço é de BITS.ToUpper()" enquanto na linha quatro $nome conterá "O serviço é BITS".

Parênteses

Além de seu uso com os métodos do objeto, parênteses também atuam como um marcador de ordem de execução, de Windows PowerShell, assim como em álgebra. Em outras palavras, os parênteses informam o shell "executar este primeiro". Toda a expressão entre parênteses é substituída por tudo o que produz dessa expressão. Eis alguns exemplos de mind-bending:

$name = (Get-Service)[0].
name
Get-Service -computerName (Get-Content names.txt)

Na linha um, $nome conterá o nome do primeiro serviço do sistema. Lendo este artigo leva um pouco de esforço. Comece com a expressão entre parênteses. Isso é o que Windows PowerShell começará com também. "Get-Service" resolve para uma coleção ou matriz, dos serviços. A [0] acessa o primeiro item em uma matriz, para que seja o primeiro serviço. Porque ele é seguido por um ponto, nós sabemos que estamos acessando uma propriedade ou método de serviço, em vez do objeto de todo o serviço. Por fim, podemos extrair apenas o nome do serviço.

Na linha dois, a expressão entre parênteses está lendo o conteúdo de um arquivo de texto. Supondo que o arquivo contém um nome de computador por linha, "Get-Content" "irá retornar uma matriz de nomes de computador. Aqueles alimenta o parâmetro "– ComputerName" de "Get-Service". Nesse caso, o shell pode alimentar qualquer expressão entre parênteses que retorna uma matriz de seqüências de caracteres para o
o parâmetro "– ComputerName", porque o parâmetro foi projetado para aceitar a matrizes de seqüências.

Escopo

O escopo é um conceito de programação que atua como um sistema de containerization. Coisas como variáveis, aliases, PSDrives e outros elementos de Windows PowerShell são armazenadas em um escopo. O shell mantém uma hierarquia de escopos e tem um conjunto de regras que determinam como os escopos possam interagir e compartilhar informações entre si.

O próprio shell é um único escopo, chamado de escopo global. Quando você executa um script, ele constrói um novo escopo e o script é executado dentro do que. Qualquer texto criado por script, como, por exemplo, uma nova variável, é armazenado dentro do escopo do script. Ele não está acessível pelo shell de nível superior.

Quando o script terminar a execução, seu escopo é descartado e nada criados dentro desse escopo desaparece. Por exemplo, criar um script que contém o seguinte (não se esqueça não digite os números de linha), e execute esse script a partir da janela do console:

New-PSDrive -PSProvider FileSystem -Root C:\ -Name Sys
Dir SYS:

Depois de executar o script, execute manualmente "Dir SYS:" e você verá um erro. Isso ocorre porque o SYS: unidade foi criada no script. Depois que o script foi feito, tudo o que ele criou foi descartado. O SYS: unidade não existe mais. Nem tudo no shell do escopo definido. Itens como módulos são manipuladas globalmente em todas as ocasiões. Um script pode carregar um módulo e o módulo permanecerá carregado após o script é feito.

Se um escopo tenta acessar algo que não tenha sido criado dentro desse escopo, Windows PowerShell procura ao escopo mais alto seguinte (o escopo de "pai"). É por isso que o Dir trabalhou alias que você acabou de script inserido. Embora o Dir não existia no escopo do script, ele existisse no escopo da mais alto seguinte: escopo global. Um escopo é livre para criar um item que tem o mesmo nome de um item de um escopo de nível mais alto, porém. Este é outro script tentar:

Dir
New-Alias Dir Get-Alias
Dir

Que pode parecer estranho, mas na primeira vez que ele foi executado "Dir", ele não existe no escopo do script. Ele usado o alias de Dir de nível mais alto. Alias aponta para Get-ChildItem, portanto, exibido uma listagem de diretório familiar.

Em seguida, o script cria um novo alias nomeado dir. Isso aponta para o Alias de Get. Isso é o que foi executado pela segunda vez. Nada disso afetado o alias de Dir de nível superior. Tente executar o Dir no shell depois de executar o script anterior, e você ainda terá uma listagem de diretório.

Escopo pode ser bastante confuso quando se trata de variáveis. Como regra, um determinado escopo nunca deveria acessar itens fora do escopo, especialmente as variáveis. Há uma sintaxe para fazê-lo, como o uso de $global: var forçosamente acessar a variável do escopo global $var, mas essa é uma prática ruim, exceto em circunstâncias muito específicas.

Linguagem de script Windows PowerShell

Windows PowerShell contém uma linguagem de script muito simples de palavras-chave de menos de duas dúzias. É um contraste perfeito para uma linguagem de programação completa, como VBScript, que contém mais de 300 palavras-chave.

O idioma de Windows PowerShell simplificado embora, é mais do que suficiente para fazer o trabalho. Vamos analisar suas principais construções scripts agora, embora você sempre pode obter mais ajuda sobre estes lendo o "tópico dentro do shell sobre" apropriado. Por exemplo, about_switchcontains informações de ajuda sobre a construção de Switch, enquanto about_if de Ajuda contém informações sobre a se construir. Executar a Ajuda sobre * para obter uma lista de todos os "tópicos sobre".

Se construir

Esta é a construção de tomada de decisão principal Windows PowerShell. Em sua forma completa, ele é semelhante a:

If ($this -eq $that) {
  # commands
} elseif ($those -ne $them) {
  # commands
} elseif ($we -gt $they) {
  # commands
} else {
  # commands
}

A palavra-chave "If" é uma parte obrigatória para essa construção. Uma expressão entre parênteses segue que deve ser avaliada como True ou False. Windows PowerShell sempre interpretarão o zero como False e qualquer valor diferente de zero como True.

Windows PowerShell também reconhece as variáveis internas $True e False $ como que representa os valores booleanos. Se a expressão entre parênteses gostar como True, os comandos no seguinte conjunto de chaves serão executado. Se a expressão for falso, os comandos não irá executar. Isso realmente é tudo o que você precisa válido, se construir.

Você pode ir um pouco além, fornecendo uma ou mais seções de "ElseIf". Essas funcionam da mesma forma como a se construir. Eles obtêm sua própria expressão entre parênteses. Se for verdadeiro, os comandos dentro dos colchetes chaves seguintes serão executados. Caso contrário, eles não.

Você pode resumir com um bloco Else, que será executado se nenhum dos blocos precedentes executar. Apenas o bloco associado com a primeira expressão verdadeira será executada. Por exemplo, se $isso não ser igual a $, e $aqueles não igual $-los, em seguida, os comandos na linha quatro seriam executado — e nada mais. Windows PowerShell ainda não avalia a segunda expressão elseif na linha de cinco.

O caractere # é um caractere de comentário, tornando Windows PowerShell essencialmente ignorar qualquer coisa a partir daí até um carro retorno. Observe também o cuidado com os quais essas construções foram formatadas. Você também pode ver a formatação como esse de alguns caras:

Não importa onde você pode colocar as chaves. No entanto, o que faz a diferença é que você seja consistente na sua colocação para que seus scripts sejam mais fáceis de ler. Também é importante recuar, no mesmo nível exato, cada linha dentro de chaves.

O ISE de Windows PowerShell permite que você use a tecla Tab para essa finalidade e o padrão será um recuo de quatro caracteres. Recuo do seu código é uma prática recomendada de núcleo. Caso contrário, você terá um tempo difícil correspondência corretamente abrindo e fechando chaves em scripts complexos. Além disso, todas as outras crianças Windows PowerShell fará com que você diversão. Considere este script mal formatado:

function mine {
if ($this -eq $that){
get-service
}}

Isso é muito mais difíceis de ler, depurar, solucionar problemas e manter. Enquanto o espaço após os parênteses de fechamento não é necessário, ele tornam mais fácil ler seu script. O código recuado não é necessário, mas ela facilita o script a seguir. Considere isso:

function mine {
 if ($this -eq $that){
  get-service
 }
}

Colocar um colchete de fechamento em uma linha por si só não é necessário para o shell, mas ele é apreciado pelo olho humano. Ser um formatador organizado, e você terá menos problemas em seus scripts.

A construção, enquanto

Esta é uma construção de loop em Windows PowerShell. Ele foi projetado para repetir um bloco de comandos desde que alguma condição for verdadeira, ou até que uma condição for verdadeira. Aqui está o uso básico:

Do {
  # commands
} While ($this -eq $that)

Nesta variação da construção, os comandos dentro dos colchetes curvas sempre serão executado pelo menos uma vez. While condição não é avaliada até que a primeira execução. Você pode mover While, caso em que os comandos serão executados somente se a condição for verdadeira em primeiro lugar:

While (Test-Path $path) {
  # commands
}

O segundo exemplo de aviso não usa um operador de comparação, como - EQ. Isso ocorre porque o cmdlet Test-Path acontece retornar verdadeiro ou falso inicial. Não é necessário para comparar que como True ou False para que a expressão trabalhar.

A expressão entre parênteses, usada com essas construções scripts simplesmente precisa simplificar para True ou False. Se você estiver usando um comando como, por exemplo, Test-Path, que sempre retorna VERDADEIRO ou falso, que é tudo o que você precisa. Como sempre, há um tópico "sobre" no shell que demonstra a outras formas de usar essa construção.

A construção ForEach

Essa construção é semelhante em operação para o cmdlet ForEach-Object. Ele difere somente em sua sintaxe. A finalidade de ForEach é pegar uma matriz (ou coleção, que é o mesmo que uma matriz em Windows PowerShell) e enumerar os objetos no array, para que você possa trabalhar com um de cada vez:

$services = Get-Service
ForEach ($service in $services) {
  $service.Stop()
}

É fácil para principiantes overthink essa construção. Tenha em mente que a palavra em inglês no plural "serviços" não significa nada para Windows PowerShell. Nome da variável é usada para lembrar-nos de que ele contém um ou mais serviços. Só porque ele é plural não faz o shell a se comportar de maneira especial.

A palavra-"in" chave na linha dois é parte da sintaxe ForEach. Variável $service é composto por. Isso poderia ter sido facilmente $fred ou $café e ele seriam funcionavam da mesma maneira.

Windows PowerShell se repetirá os comandos da construção — aqueles contidos entre chaves — uma vez para cada objeto na segunda variável (serviços de $). Cada vez, ele irá levar a um único objeto a partir da segunda variável (serviços de $) e colocá-lo na primeira variável (serviço$).

Dentro deste construtor, use a primeira variável (serviço$) para trabalhar com um objeto individual. Na linha de três, indica o período de "eu não quero trabalhar com o objeto inteiro, apenas um dos seus membros — o método Stop."

Há momentos em uso de ForEach é inevitável e desejáveis. No entanto, se você tiver um pouco de programação ou scripts de experiência, às vezes pode leap usando ForEach quando não for a melhor abordagem. O exemplo anterior não é um bom motivo para usar ForEach. Isso seria mais fácil:

Get-Service | Stop-Service

O ponto aqui é avaliar o uso de ForEach. Certificar-se de que esta é a única maneira de realizar a tarefa à mão. Aqui estão algumas instâncias onde ForEach é provavelmente a única maneira de ir:

  • Quando você precisar executar um método contra um monte de objetos e houver um cmdlet que executa a ação equivalente.
  • Quando você possui um monte de objetos e precisa executar várias ações consecutivas em relação a cada um.
  • Quando você tem uma ação que só pode ser executada em relação a um objeto ao mesmo tempo, mas o script pode estar trabalhando com um ou mais objetos e você tem uma maneira de saber antecipadamente.

Outras construções

Windows PowerShell tem várias outras construções de scripts, incluindo o Switch, para, e assim por diante. Todos esses são documentados em "sobre" tópicos da Ajuda dentro do shell. Às vezes, você pode usar as construções abordadas aqui para substituir essas outras construções. Por exemplo, você pode substituir o Switch com uma instrução If construção que utiliza várias seções ElseIf. Você pode substituir para com ForEach, ou mesmo com o cmdlet ForEach-Object. Por exemplo, com um loop que será executado exatamente dez vezes:

1..10 | ForEach-Object -process {
  # code here will repeat 10 times
  # use $_ to access the current iteration
  # number
}

Cabe a você selecionar a melhor construção para realizar o trabalho. Se você estiver navegando na Internet para scripts, esteja preparado para ser executado em qualquer e todas as variações.

Funções

Uma função é um tipo especial de construção usada para conter um grupo de comandos relacionados que realizam uma tarefa única e específica. Em termos gerais, você pode assumir qualquer script Windows PowerShell e "empacotá-lo" dentro de uma função:

function Mine {
  Get-Service
  Get-Process
}
Mine

Isso define uma nova função chamada "Meus". Que basicamente transforma as minhas em um comando, o que significa que você pode executar a função simplesmente inserindo seu nome. Isso é o que cinco faz de linha. Ele executa a função.

Normalmente, as funções estão contidas dentro de um arquivo de script. Um único script pode conter várias funções. Funções podem-se até mesmo conter outras funções.

No entanto, as funções são itens com escopo. Isso significa que você só pode usar uma função dentro do mesmo escopo no qual ele foi criado. Se você coloca uma função em um script e, em seguida, execute esse script, é possível que a função só estará disponível dentro do script e somente para a duração do script. Quando o script termina a execução, a função — como tudo no escopo do script — desaparecer. Aqui está um exemplo:

function One {
  function Two {
Dir
  }
  Two
}
One
Two

Suponha que você insira isso em um único arquivo de script e executar esse script. Linha sete executa a função a um, que começa na linha de um. A linha cinco executa uma função denominada dois, que começa na linha dois. Para que o resultado será uma listagem de diretório, que está na linha de três dentro da função dois.

Entretanto, a próxima linha a ser executada será a linha oito, e isso resultará em erro. O script não contém uma função chamada dois. Função dois é incluída dentro da função de um. Como resultado, que existe dentro da função de um escopo. Apenas outras coisas dentro de função, um podem ver dois. Tentando chamar dois a partir de outra anyplace resultará em erro.

Adicionando parâmetros a um Script

É raro para criar um script destinado a fazer exatamente a mesma coisa, sempre que ele for executado. Com mais freqüência, você terá de scripts que contêm algum tipo de dados da variável ou o comportamento da variável. Você pode acomodar essas variações com parâmetros.

Parâmetros são definidos de maneira especial na parte superior do script. Você pode preceder a essa definição com comentários, mas caso contrário, ele deve ser as primeiras linhas de executáveis do código dentro do script. Dentro da área de definição do parâmetro, cada parâmetro é separado do próximo por uma vírgula. Acompanhando a idéia de formatação organizada, ele ajuda a colocar cada parâmetro em uma linha própria. Veja um exemplo:

param (
  [string]$computername,
  [string]$logfile,
  [int]$attemptcount = 5
)

Este exemplo define três parâmetros. Dentro do script, eles são simplesmente usados como qualquer outra variável. Você observará que na linha quatro, eu atribuído um valor padrão para o parâmetro de attemptcount $. O padrão será substituído por qualquer parâmetro de entrada, mas será usado se o script é executado sem que o parâmetro especificado.

Aqui estão várias maneiras em que o script pode ser executado, supondo que salvei como Test. ps1:

./test -computername SERVER
./test -comp SERVER -log err.txt -attempt 2
./test SERVER err.txt 2
./test SERVER 2
./test -log err.txt -attempt 2 -comp SERVER

O script aceita parâmetros, bem como qualquer cmdlet. Nomes de variáveis são usados como os nomes de parâmetro especificados com o traço usual que precede a todos os nomes de parâmetro na Windows PowerShell. Aqui está uma análise detalhada de como ele funciona:

  • Na linha um, eu estou apenas especificando um dos parâmetros —$ logfile, portanto, estará vazio e $attemptcount irá conter 5, o padrão.
  • Na linha dois, eu estou especificando três parâmetros, embora eu estou fazendo, de forma usando nomes de parâmetro de reduzido. Assim como acontece com os cmdlets, você só precisará digitar suficiente do nome do parâmetro Windows PowerShell saber qual delas você está falando.
  • A linha três me mostra novamente todos os três parâmetros, embora eu estou fazendo isso por posição, sem usar nomes de parâmetro. Desde que eu me lembro fornecer os valores na ordem exata em que os parâmetros estão listados no script, isso funcionará bem.
  • Linha quatro mostra o que acontece se você não for cuidadoso. Aqui, nome_do_computador $ conterá 'Servidor' e $logfile conterá 2, enquanto $attemptcount irá conter 5. É que provavelmente não pretendo. Quando você não usar nomes de parâmetro, é mais difícil ser flexível. Também é mais difícil para alguém para decodificar o que você entende, que torna mais difícil para que eles possam solucionar quaisquer problemas.
  • Linha de cinco é um exemplo melhor. Aqui, especifiquei parâmetros fora de ordem, mas é bem porque eu usado nomes de parâmetro. Como regra geral, eu sempre use nomes de parâmetro para o maior grau de flexibilidade. Eu não preciso lembrar-se a ordem na qual eles vieram.

Scripts avançados

Windows PowerShell oferece suporte a uma técnica para especificar informações adicionais sobre parâmetros. Isso permite que você declarar um parâmetro como obrigatória, aceitar a entrada do pipeline e assim por diante. Essa técnica é chamada de ligação do Cmdlet.

Ele não altera o modo como o script usa parâmetros. Ele simplesmente apresenta o shell um pouco mais informações sobre os parâmetros. Você encontrará essa técnica mais comumente usada em uma função, mas a sintaxe é válida dentro de um script bem. Este é um exemplo simples:

[CmdletBinding()]
param (
  [Parameter(Mandatory=$True)]
  [string]$computername,

  [Parameter(Mandatory=$True)]
  [string]$logfile,

  [int]$attemptcount = 5
)

Tudo o que eu adicionei era a instrução [CmdletBinding()], como a primeira linha executável do código dentro do script. Ele está correto para comentários deve preceder isso, mas nada mais. Também adicionei uma instrução de [Parameter()] a dois dos meus parâmetros. Dentro dessa instrução [Paramater()], indiquei que esses parâmetros são obrigatórios. Agora, se alguém tentar executar o script sem especificar esses parâmetros, Windows PowerShell irá solicitá-los para obter as informações.

Observe que o último parâmetro não tem quaisquer instruções especiais e todos os três parâmetros ainda aparecem em uma lista separada por vírgulas (o que significa que os dois primeiros parâmetros são seguidos por vírgulas). Há uma tonelada de outras instruções, você pode especificar para um parâmetro que você possa ler sobre o about_functions_advanced_parameters tópico da Ajuda.

Essa foi uma revisão estonteante de alguns conceitos-chave de Windows PowerShell relacionados a scripts. Espero que você aprender algo novo. Ser capaz de criar scripts com parâmetros é especialmente útil, pois você poderá fazer scripts que pareçam e se comportam como cmdlets nativos do Windows PowerShell.

Don Jones

Don Jones é um destinatário de prêmio de MVP da Microsoft e autor de "Saiba Windows PowerShell em um mês de almoços" (Manning Publications, 2011), um livro, projetado para ajudar a qualquer administrador tornam-se eficazes com Windows PowerShell. Jones também oferece treinamento de Windows PowerShell público e no local. Entre em contato com ele por meio de seu site em ConcentratedTech.com.

Conteúdo relacionado