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.

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.


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.


@ 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}


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.


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

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.


6

É um liner do PowerShell:

while ($true) { <your command here> | Out-Host; Sleep 5; Clear }

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

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


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.


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



-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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.