Script powershell - melhorar desempenho - Programação - outros - Clube do Hardware
Script powershell - melhorar desempenho
Por Robson Souza_732003, 31 de agosto de 2016 em Programação - outros
Recentemente na empresa onde trabalho decidimos substituir os scripts que usamos para controlar os Laboratórios de informática, que atualmente são feitos em VBS, por scripts em Powershell.
Pelo que lemos a respeito, é uma ferramenta poderosa e nos pareceu bastante promissora para nos ajudar em nossas tarefas.
Uma dessas tarefas é desligar todos os computadores de uma determinada faixa de IP ao final do expediente através de um script que é executado pelo servidor.
Conseguimos criar o script que faça isso em Powershell, porém comparado ao script do VBS a velocidade de execução caiu muito. Aparentemente ele envia o comando para desligar 1 computador e aguarda uma confirmação (demorada) para depois executar o próximo comando. E para piorar, se algum dos computadores já estiver desligado, ele demora muito mais para avançar para o próximo comando.
Segue parte do script:
Function Desligar-Lab {
IF ($Lab -eq 9 -or $Lab -eq 10 -or $Lab -eq 11 -or $Lab -eq 12 -or $Lab -eq 13 -or $Lab -eq 14 -or $Lab -eq 15 -or $Lab -eq 16) {
$ban_Final = 2
$maq_Final = 22
$ban_Final = 4
$maq_Final = 9
$c = Get-Credential "DOMAIN\administrador"
for ($ban=0; $ban–lt $ban_Final+1; $ban++) {
for ($maq = 11 ; $maq -lt $maq_Final+1; $maq++) {
IF ("$ban"+"$maq" –ne 222){
IF ($ban –eq 0){
IF ($maq –ne 11){
Stop-Computer 10.117.$Lab.$maq -credential $c -force
Stop-Computer 10.117.$Lab.$ban$maq -credential $c -force
Write-Progress -Activity "Desligando computador: " -status "$ban$maq"
for ($ban=1; $ban –lt $ban_Final+1; $ban++){
for ($maq = 1 ; $maq -lt $maq_Final+1; $maq++) {
IF ("$ban"+"$maq" –ne 49){
IF ("$ban"+"$maq" –ne 11){
De acordo com algumas coisas que eu li, achei que resolveria esse problema enviando os comandos de forma paralela (-parallel), porém só é possível executar diversos comandos de forma paralela se a execução for dentro de um Workflow, e o Workflow não reconhece credenciais (-credential), e a credencial é parâmetro necessário para execução do cmdlet de desligar computadores remotamente.
Da para forçar digitar os dados da credencial a cada execução de comando, mas imagina ter que digitar a senha de administrador da rede mais de 300 vezes perto do fim do expediente. Nada prático.
Se alguém ja passou por isso ou tiver ideia de como resolver, eu agradeço imensamente.
Ao invés de executar tudo no mesmo script, deixe a logica em um e o comando e outro, no script com os comandos, recebe a informações como parâmetros e inicie o mesmo através do comando start, assim você terá um terminal para cada iteração.
Robson Souza_732003
2 minutos atrás, TulioBotinha disse:
Acho que eu entendi o que você quis dizer. Assim que possível vou fazer os testes. Por hora, muito obrigado.