Execução de scripts ou funções do powershell usando a sintaxe de pipeline do tipo unix

1

Eu quero executar várias etapas de processamento personalizadas usando o pipeline no powershell.

No linux eu poderia fazer algo assim:

listServers.sh | <some commands to filter servers> | commandToApplyToEachServer.sh

E coloque o código relevante para cada etapa em diferentes scripts (cada comando pode ter vários parâmetros e pelo menos o último pode ser substituído por um script diferente)

Eu gostaria de fazer algo semelhante no powershell, sem adicionar nenhuma "sobrecarga" (ter que criar scripts antes de usar suas funções, ter que re-source scripts se houver mudanças etc)

A execução dos comandos diretamente no prompt é fácil:

"server1","server2" | % {Get-Service -Name myservicename -ComputerName $_ | Set-Service -Status Stopped }

... mas quero permitir que os usuários (e eu) sejam mais fáceis & maneira mais robusta de fazer isso e comandos semelhantes (basicamente envolvendo cada passo em um script ou função, qualquer que seja a maneira mais poderosa de fazer as coisas).

O mais próximo que eu cheguei é isto:

[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)]
    $env
)

Function global:srv {
  Begin {
  }

  Process {
    Get-Service -Name someServiceName -ComputerName $_
  }

  End {
  }
}

Get-Content "$env.csv"

O que me permite executar coisas como:

.\listServers.ps1 appServers | srv

Mas infelizmente a função srv só é atualizada APÓS todo o comando ter terminado de rodar (então qualquer alteração na função de pipe não terá efeito até a segunda vez que eu executar, e é claro que eu preciso listServers.ps1 de origem antes que eu possa fazer qualquer coisa, porque o srv não existe até então)

UPDATE: Eu segui em frente usando uma abordagem de script único (usando alguns parâmetros para manipular a filtragem e controlar qual comando eu quero que seja executado no final, não usando pipeline). Mas ainda seria interessante saber se é possível usar o pipeline.

    
por Cyberwiz 17.09.2014 / 13:22

1 resposta

1

Parece que a tradução mais literal de

listServers.sh | <some commands to filter servers> | commandToApplyToEachServer.sh

seria como:

Get-content listServers.txt | Where-Object {*attributes and whatever} | CommandToRun

Com o PowerShell e a tubulação, tudo depende de como você obtém e canaliza tudo. Por exemplo, digamos que eu queira reinicializar todos os meus servidores com o nome MAILSERVERxxxx:

Get-QADComputer -name * | where-object {$_.Name -Match "$MAILSERVER"} | Restart-Computer -ComputerName $_.Name

poderia ser feito, mas mais em linha com as práticas do PowerShell, muitas vezes você pode lidar com isso de maneira muito diferente:

Get-QADComputer -Name "MAILSERVER*" | Restart-Computer $_.Name

Algumas notas:

    O
  • PowerShell é muito flexível
  • O PowerShell foi criado para trazer a linha de comando do Windows para os níveis BASH de utilitário
  • A sintaxe também é flexível
  • Get-QADComputers é um cmdlet da Quest e agora da Dell

Você também pode usar uma sintaxe semelhante a C para fazer muitas das mesmas coisas, e isso amplia ainda mais o poder do PowerShell.

Se você quiser, por exemplo, ler um arquivo, criar e criar uma matriz com base nos critérios de correspondência e, em seguida, fazer algo antes de prosseguir:

$someArray = @()
Get-Content "H:\SomeFile.txt" | '
Foreach-object {
 if ($_ -MAtch "$MAILSERVER") { $someArray += $_}
 }

$someArray | foreach-Object {
  if (Test-Connection "$_") {
    $Version = (Get-WmiObject -ComputerName "$_" -Class "Win32_OperatingSystem").Version
  }
}

Espero que isso ajude.

    
por 23.09.2014 / 13:34