¿Cuál es el análogo de Windows del comando watch de Linux?

58

Estoy buscando una función de programa / script / línea de comando de Windows que funcione como el watchprograma de Linux .

watch llama periódicamente a otro programa / lo que sea y muestra el resultado, que es excelente para actualizar un archivo de salida o similar cada segundo:

watch cat my-output.txt

o, más poderosamente:

watch grep "fail" my-output.txt

Lo he buscado en la biblioteca de cygwin, pero no parece estar presente.

PeterJCLaw
fuente

Respuestas:

14

watchestá disponible en Cygwin, en el procpspaquete que se enumera aquí (esta información se puede encontrar a través de la búsqueda de paquetes en el sitio web, aquí ). No creo que este paquete esté instalado por la configuración predeterminada de cygwin, pero es uno que generalmente selecciono en nuevas instalaciones para tener el comando watch disponible.

La ubicación de las herramientas en los paquetes generalmente coincide con los nombres de los paquetes en las distribuciones de Linux (el paquete que contiene también watches procps en Debian y Ubuntu), por lo que si la función de búsqueda de paquetes de Cygwin falla, la información para / de las distribuciones de Linux puede ofrecer pistas.

David Spillett
fuente
47

Escribe lo tuyo. Digamos que el archivo watch.batcontiene:

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

y llamarlo a través de, por ejemplo:

watch echo test

hará eco testcada 5 segundos.

harrymc
fuente
@Keilaron: Tenga en cuenta que su edición fue mala y tuve que arreglarla. Por favor ten más cuidado.
Scott
Simple pero genial. Evita instalar cygwin solo para ese comando único. Vielen Dank!
Stef
28

Powershell tiene el comando "while". Puedes usarlo como en Linux:

while (1) {your_command; dormir 5}

Versión de Linux:

si bien es cierto; haz tu_comando; dormir5; hecho

Otros:

while ($ true) {netstat -an | Findstr 23560; dormir 5; fecha}

Mikis
fuente
44
Puedes usarlo while (1), porque 1es verdad.
TheQuickBrownFox
1
También descubrí que puedes usar "clear" como la última declaración, por lo que se comporta más como watch.
itmuckel
13

Un comando genérico de Windows oneliner para lograr esto:

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

Reemplace "prueba de eco" con el comando que desea ejecutar repetidamente.

w1mb0r
fuente
bonito, revestimiento simple que hace el truco
user230910
6

Escribí este pequeño módulo de PowerShell para hacer lo que estabas buscando. Solo ponlo en

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

y ejecutar import-module watchen 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
fuente
1
Se ve bastante bien, pero recomendaría que la función esté en formato Verbo-Sustantivo (p Watch-Command. Ej. ) Con un alias de Watch( Set-Alias -Name Watch -item Watch-Command).
duct_tape_coder
6

Así es como lo haría en PowerShell:

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

La condición while(1)es equivalente a un while truebucle indefinido.

klaypigeon
fuente
6

Es un revestimiento de PowerShell:

while ($true) { <your command here> | Out-Host; Sleep 5; Clear }
ErikW
fuente
Yo pondría Clearprimero.
sastanin
depende de cuánto tiempo tarda su comando en ejecutarse y luego salir a mostrarse ... puede cambiar el orden, pero esta es la idea general
ErikW
3

También puede compensar un retraso utilizando el comando PING, por ejemplo:

@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
fuente
2

Tuve el mismo problema cuando necesité verificar el tamaño de un archivo en el que otro proceso estaba trabajando activamente. Terminé clonando la funcionalidad de watch en Windows. El exe compilado y la fuente están disponibles en el sitio.

ver para Windows

garrettg84
fuente
1

Creé un comando watch para windows llamado llwatch.

El código está en mi sitio web landenlabs.com

y también en GitHub

Es posible que necesite usar x64 para ver programas x64 y x32 para los demás. No estoy seguro de lo exigentes que son las ventanas.

LanDenLabs
fuente
No estoy seguro de por qué esto fue rechazado ... ¡Bienvenido a Super User !
jpaugh
1

lo que dijo @harrymc excepto con sleep watch.bat

@ECHO OFF
:loop
  %*
  sleep 5
goto loop

./watch.bat npm ejecutar prueba

npm run test cada 5 segundos

usuario2167582
fuente
-1

Tenía prisa ... Usé una sugerencia y la cambié un poco para que funcionara para mí:

para / l% g in () do @ (prueba de eco y tiempo de espera / t 2)

Lo cambié a:

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

Y creé el archivo test.bat con la línea de comando. En mi caso, fue:

grupo / dominio neto

Descubrí que el comando echo acaba de imprimirse en la pantalla pero no ejecutó el comando

aguilae
fuente