Interromper a execução por um determinado período de tempo

É frequente na construção de scripts termos a necessidade de induzir demora na execução de comandos por forma a termos a certeza que os mesmos foram concluídos com sucesso ou simplesmente dar a oportunidade ao utilizador de analisar/observar a execução do comando.

O objetivo deste artigo é mostrar os diferentes métodos de que o Windows dispõe para interromper, por um determinado período de tempo, a execução de um comando.

Lista de comandos passíveis de serem usadas para induzir paragem:

  • PAUSE
  • CHOICE
  • WAITFOR
  • TIMEOUT
  • PING
  • START /WAIT
  • Start-Sleep
  • WScript.Sleep

 

 

PAUSE

O comando PAUSE suspende o processamento de um programa batch e apresenta a mensagem “Prima qualquer tecla para continuar…”. Enquanto o operador não pressionar qualquer tecla a execução da batch não prossegue.

Exemplo #1:

PAUSE

image

 

 

CHOICE

O comando CHOICE permite que seja apresentada ao utilizador um conjunto de opções. Pode usar-se esta necessidade de interatividade com o operador para induzir uma paragem no processamento.

Exemplo #1

(Aguarda por tempo indeterminado que o utilizador escolha uma opção)

CHOICE /C SNC /M "Prima S para Sim, N para Não ou C para Cancelar."

Exemplo #2

(Aguarda que o utilizador escolha no espaço de 10 segundos uma opção. Se não escolher qualquer opção será assumido automaticamente o “S”)

CHOICE /T 10 /C SNC /CS /D S

image

 

 

WAITFOR

Este comando envia ou aguarda por um sinal do sistema. Podemos usar este comando de diferentes formas:

Exemplo #1

(Aguarda 10 segundos pela receção do sinal “Teste”)~

WAITFOR Teste /T 10

Exemplo #2

(Aguarda por tempo indeterminado a receção do sinal “Teste”)

Na máquina A executar:

WAITFOR Teste

Na máquina B executar

WAITFOR /SI Teste

image

 

 

TIMEOUT

O comando TIMEOUT induz uma paragem na execução de comandos por um determinado período de tempo, período esse que pode ser infinito.

Exemplo #1

(Aguarda 10 segundos e apresenta um contador regressivo)

TIMEOUT /T 10

Exemplo #2

(Aguarda por tempo indeterminado até que o utilizado pressione qualquer tecla)

TIMEOUT /T –1

Exemplo #3

(Aguarda 10 segundos e ignora qualquer tecla pressionada pelo utilizador)

TIMEOUT /T 10 /NOBREAK

image

 

PING

Este comando apesar de não ser um comando de interrupção pode usar-se para provocar atraso, isto é, parte-se do principio que o tempo de reposta do comando é de 1 segundo e pode desta forma manipular-se o atraso pretendido.

Exemplo #1

(Aguarda 10 segundos)

ping -n 10 127.0.0.1

#Exemplo #2

(Idêntico ao anterior mas com supressão do resultado de saída)

ping -n 10 127.0.0.1 > NUL

image

 

START /WAIT

Este método não é propriamente uma função de interrupção mas sim uma funcionalidade do comando START que permite que os comandos sejam interrompidos até que a nova janela termine a execução

Exemplo #1

(Aguarda que o comando ping seja terminado)

START /WAIT ping 127.0.0.1

image

 

Start-Sleep

Este comando é nativo do PowerShell por isso a sua execução requer este ambiente. A sintaxe é simples e permite especificar o tempo de interrupção pretendido.

Exemplo #1

(Aguarda 10 segundos)

Start-Sleep 10

image

 

 

WScript.Sleep

Este comando é nativo do Windows Script Host por isso a sua execução envolve a execução do motor de interpretação desta linguagem de scripting. No exemplo abaixo vou mostrar como é que se pode usar provocar atraso usando apenas uma linha de comando

Exemplo #1 (Cria um ficheiro vbs e executa a instrução de interrupção de 10 segundos)

ECHO WScript.sleep 10000 > temp.vbs && cscript temp.vbs

image

 

Conhecem mais métodos ou usam outras técnicas para induzir demora ou interrupção nos scripts? Partilhem o vosso conhecimento preenchendo a caixa de comentários.

Como obter a chave de produto do Windows

Recentemente tive a necessidade de conseguir saber qual foi a chave de produto (Product Key) usada na instalação do Windows. Esta situação foi provocada pela necessidade de reinstalar o sistema operativo e o dono do computador não se lembrar onde a tinha guardado. Apesar de se poder instalar o Windows 7 sem especificar a chave, o mesmo não se aplica à ativação do mesmo, logo teria de aproveitar o facto do sistema operativo ainda funcionar para conseguir saber qual foi a chave usada no momento da instalação.

É verdade que existem muitas aplicações no mercado que resolvem esta situação, mas o objetivo deste artigo é mostrar como é que se consegue obter esta informação usando apenas os recursos que já se encontram disponíveis no sistema operativo.

A chave de produto do Windows está armazenada numa entrada do registo de forma encriptada. A cifra usada é publica e encontra-se documentada no portal da Microsoft.

 

Instruções:

1 – Clicar em “Iniciar” e escrever “PowerShell ISE”

2 – No editor PowerShell colar o seguinte código:

 

 

function Get-WindowsKey


   
param ($targets = ".")
    $hklm = 2147483650
    $regPath = "Software\Microsoft\Windows NT\CurrentVersion"
    $regValue = "DigitalProductId4"
    Foreach ($target in $targets) {
        $productKey = $null
        $win32os = $null
        $wmi = [WMIClass]"\\$target\root\default:stdRegProv"
        $data = $wmi.GetBinaryValue($hklm,$regPath,$regValue)
        $binArray = ($data.uValue)[52..66]
        $charsArray = "B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9" 
        For ($i = 24; $i -ge 0; $i--) {
            $k = 0
            For ($j = 14; $j -ge 0; $j--) {
                $k = $k * 256 -bxor $binArray[$j]
                $binArray[$j] = [math]::truncate($k / 24)
                $k = $k % 24
            }
            $productKey = $charsArray[$k] + $productKey
            If (($i % 5 -eq 0) -and ($i -ne 0)) {
                $productKey = "-" + $productKey
            }
        }
        $win32os = Get-WmiObject Win32_OperatingSystem -computer $target
        $obj = New-Object Object
        $obj | Add-Member Noteproperty "Nome do Computador" -value $target
        $obj | Add-Member Noteproperty "Edição do Windows" -value $win32os.Caption
        $obj | Add-Member Noteproperty "Versão do Service Pack" -value $win32os.CSDVersion
        $obj | Add-Member Noteproperty "Arquitetura" -value $win32os.OSArchitecture
        $obj | Add-Member Noteproperty "Número da Versão" -value $win32os.BuildNumber
        $obj | Add-Member Noteproperty "Registado para" -value $win32os.RegisteredUser
        $obj | Add-Member Noteproperty "Canal de origem (ProductID)" -value $win32os.SerialNumber
        $obj | Add-Member Noteproperty "Chave do produto (ProductKey)" -value $productkey
        $obj
    }
}

Get-WindowsKey

 

 

blog055

 

3 – Pressionar a tecla F5 ou então clicar no botão play

 

 

Na área de resultados vai aparecer o seguinte:

Nome do Computador                       : .
Edição do Windows                            : Microsoft Windows 7 Enterprise
Versão do Service Pack                    : Service Pack 1
Arquitetura                                            : 64-bit
Número da Versão                              : 7601
Registado para                                      : NOME_DO_REGISTO
Canal de origem (ProductID)         : 11111-11111-11111-11111
Chave do produto (ProductKey) : A123A-A123A-A123A-A123A-A123A

 

 

O script PowerShell que aqui coloquei foi desenhado por forma a ser possível obter a chave de produto em múltiplas máquinas remotas, bastando para isso passar o nome do(s) computador(es) à função Get-WindowsKey. Quando o nome da máquina não é especificado o mesmo é substituído por “.” o que corresponde à máquina local.

Para que este script funcione em máquinas remotas é necessário garantir que o contexto de utilizador na qual o script é executado tem permissões de administração sobre a máquina remota e/ou permissões sobre os objetos WMI das máquinas remotas.

Nas instalações OEM do Windows a chave obtida através deste método é diferente daquela que se encontra impressa no COA (Certificado de Autenticidade). Isto significa que a chave obtida é apenas válida quando usada em conjunto com o meio de instalação/recuperação fornecido pelo fabricante do computador.

 

 

Recursos adicionais:

Página de onde foi retirado o script original: http://mspowershell.blogspot.pt/2009/02/retrieveing-windows-product-key.html

Página oficial do PowerShell:

http://technet.microsoft.com/pt-pt/scriptcenter/dd742419.aspx

Como interpretar o valor do ProductID:

http://support.microsoft.com/kb/936607/pt

 

Notas:

– O resultado apresentado em “ProductID” e “ProductKey” foram alterados propositadamente neste artigo.

– Efetuei alterações ao script original por forma a corrigir uma pequena anomalia relativa ao nome da chave e efetuei a tradução dos resultados obtidos para o idioma Português.

– Em versões anteriores ao Windows 7 a chave é DigitalProductID

– Não funciona em Windows 8 e/ou Windows Server 2012