Qual é o análogo do Windows do comando watch do Linux?

58

Estou procurando uma função de programa / script / linha de comando do Windows que funcione como o watchprograma do Linux .

watch periodicamente chama outro programa / qualquer coisa e mostra o resultado, o que é ótimo para atualizar um arquivo de saída ou similar a cada segundo:

watch cat my-output.txt

ou, mais poderosamente:

watch grep "fail" my-output.txt

Eu procurei na biblioteca do cygwin, mas não parece estar presente.

PeterJCLaw
fonte

Respostas:

14

watchestá disponível no Cygwin, no procpspacote listado aqui (essas informações podem ser encontradas na pesquisa de pacotes no site, aqui ). Não acho que este pacote seja instalado pela configuração padrão do cygwin, mas geralmente seleciono em novas instalações para ter o comando watch disponível.

A localização das ferramentas nos pacotes geralmente corresponde aos nomes dos pacotes nas distribuições Linux (o pacote também contém watchprocps no Debian e no Ubuntu). Portanto, se a função de busca de pacotes Cygwin falhar, as informações de / para as distribuições Linux podem oferecer dicas.

David Spillett
fonte
47

Escreva o seu próprio. Digamos que o arquivo watch.batcontenha:

@ECHO OFF
:loop
  cls
  %*
  timeout /t 5 > NUL
goto loop

e chame-o via, por exemplo:

watch echo test

ecoará a testcada 5 segundos.

harrymc
fonte
@ Keilaron: Observe que sua edição foi ruim e eu tive que corrigi-la. Por favor tenha mais cuidado.
Scott
Simples, mas ótimo. Evita instalar o cygwin apenas para esse único comando. Vielen Dank!
Stef
28

O PowerShell possui o comando "while". Você pode usá-lo como no Linux:

while (1) {seu_command; dormir 5}

Versão do Linux:

enquanto verdadeiro; faça o seu_command; sleep5; feito

Outras:

while ($ true) {netstat -an | findstr 23560; dormir 5; encontro}

Mikis
fonte
4
Você pode simplesmente usar while (1), porque 1é verdade.
TheQuickBrownFox
1
Também descobri que você pode usar "clear" como a última declaração, por isso se comporta mais como o relógio.
itmuckel
13

Um oneliner de comando genérico do Windows para fazer isso:

for /l %g in () do @( echo test & timeout /t 2 )

Substitua "teste de eco" pelo comando que você deseja executar repetidamente.

w1mb0r
fonte
nice one, forro de um simples que faz o truque
user230910
6

Eu escrevi este pequeno módulo do PowerShell para fazer o que você estava procurando. Basta colocá-lo

C:\Users\[username]\Documents\WindowsPowerShell\Modules\Watch

e execute import-module watchno PowerShell.


# ---- BEGIN SCRIPT
# Author:       John Rizzo
# Created:      06/12/2014
# Last Updated: 06/12/2014
# Website:      http://www.johnrizzo.net

function Watch {
    [CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='High')]
    param (
        [Parameter(Mandatory=$False,
                   ValueFromPipeline=$True,
                   ValueFromPipelineByPropertyName=$True)]
        [int]$interval = 10,

        [Parameter(Mandatory=$True,
                   ValueFromPipeline=$True,
                   ValueFromPipelineByPropertyName=$True)]
        [string]$command
    )
    process {
        $cmd = [scriptblock]::Create($command);
        While($True) {
            cls;
            Write-Host "Command: " $command;
            $cmd.Invoke();
            sleep $interval;
        }
    }
}

Export-ModuleMember -function Watch

# --- END SCRIPT
johnrizzo1
fonte
1
Parece muito bom, mas eu encorajaria a função a estar no formato Verbo-Substantivo (por exemplo Watch-Command) com um apelido de Watch( Set-Alias -Name Watch -item Watch-Command).
duct_tape_coder 8/03
6

É assim que eu faria no PowerShell:

while(1){ netstat -an|grep 1920;start-sleep -seconds 2;clear }

A condição while(1)é equivalente a while true, loop indefinidamente.

klaypigeon
fonte
6

É um liner do PowerShell:

while ($true) { <your command here> | Out-Host; Sleep 5; Clear }
ErikW
fonte
Eu colocaria em Clearprimeiro lugar.
Sastanin
depende de quanto tempo o seu comando leva para executar e depois exibir para exibir .... você pode alterar a ordem, mas esta é a idéia geral
ErikW
3

Você também pode compensar um atraso usando o comando PING, por exemplo:

@echo off
:loop
  cls
  dir c:\temp
  REM 5000mS (5 sec) delay...
  ping 1.1.1.1 -n 1 -w 5000 >NUL
goto loop
Linker3000
fonte
2

Eu tive o mesmo problema ao precisar verificar o tamanho do arquivo que está sendo trabalhado ativamente por outro processo. Acabei clonando a funcionalidade do watch no Windows. O exe compilado e a fonte estão disponíveis no site.

assistir para Windows

garrettg84
fonte
1

Eu criei um comando watch para windows chamado llwatch.

O código está no meu site landenlabs.com

e também no GitHub

Pode ser necessário usar x64 para assistir a programas x64 e x32 para os outros. Não tenho certeza de como as janelas são exigentes.

LanDenLabs
fonte
Não sei por que isso foi prejudicado ... Bem-vindo ao superusuário !
jpaugh
1

o que @harrymc disse, exceto com sleep watch.bat

@ECHO OFF
:loop
  %*
  sleep 5
goto loop

./watch.bat npm run test

npm run test a cada 5 s

user2167582
fonte
-1

Eu estava com pressa .... Usei uma sugestão e mudei um pouco para trabalhar para mim:

para / l% g em () do @ (teste de eco e tempo limite / t 2)

Eu mudei para:

para / l% g em () do @ (test.bat & timeout / t 2)

E eu criei o arquivo test.bat com a linha de comando. No meu caso, foi:

grupo / domínio da rede

Descobri que o comando echo acabou de ser impresso na tela, mas não o executou

aguilae
fonte