Qual è l'analogo di Windows del comando watch di Linux?


58

Sto cercando una funzione di programma / script / riga di comando di Windows che funzioni come il watchprogramma Linux .

watch chiama periodicamente un altro programma / qualunque cosa e mostra il risultato, il che è ottimo per aggiornare un file di output o simile ogni secondo:

watch cat my-output.txt

o, più efficacemente:

watch grep "fail" my-output.txt

L'ho cercato nella biblioteca di Cygwin, ma non sembra essere presente.

Risposte:


14

watchè disponibile in Cygwin, nel procpspacchetto come elencato qui (queste informazioni sono disponibili tramite la ricerca del pacchetto sul sito Web, qui ). Non penso che questo pacchetto sia installato dall'impostazione predefinita di Cygwin, ma di solito seleziono una nuova installazione per rendere disponibile il comando watch.

La posizione degli strumenti nei pacchetti di solito corrisponde ai nomi dei pacchetti nelle distribuzioni Linux (il pacchetto contenente watchè procps anche su Debian e Ubuntu), quindi se la funzione di ricerca dei pacchetti Cygwin non riesce, le informazioni per / dalle distribuzioni Linux possono offrire indizi.


47

Scrivi il tuo. Supponiamo che il file watch.batcontenga:

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

e chiamalo via, ad esempio:

watch echo test

farà eco testogni 5 secondi.


@Keilaron: nota che la modifica è stata negativa e ho dovuto ripararla. Per favore, stai più attento.
Scott,

Semplice ma eccezionale. Evita l'installazione di Cygwin solo per quel singolo comando. Vielen Dank!
Stef,

28

Powershell ha il comando "while". Puoi usarlo come in Linux:

while (1) {tuo_comando; dormire 5}

Versione Linux:

mentre vero; fai il tuo_comando; sleep5; fatto

Altri:

while ($ true) {netstat -an | findstr 23560; dormire 5; Data}


4
Puoi semplicemente usare while (1), perché 1è vero.
TheQuickBrownFox

1
Ho anche scoperto che puoi usare "clear" come ultima affermazione, quindi si comporta più come guardare.
Itmuckel,

13

Un oneliner di comandi Windows generico per eseguire ciò:

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

Sostituisci "test eco" con il comando che desideri eseguire ripetutamente.


uno bello, un semplice liner che fa il trucco
user230910

6

Ho scritto questo piccolo modulo PowerShell per fare quello che stavi cercando. Inseriscilo e basta

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

ed eseguire import-module watchin 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
Sembra piuttosto buono, ma incoraggio la funzione di essere nel formato Verbo-Noun (ad es. Watch-Command) Con un alias di Watch( Set-Alias -Name Watch -item Watch-Command).
duct_tape_coder l'

6

Ecco come lo farei in PowerShell:

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

La condizione while(1)è equivalente a while true, loop a tempo indeterminato.


6

È una fodera di PowerShell:

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

ClearPrima lo metterei .
sastanin,

dipende da quanto tempo richiede l'esecuzione del comando e quindi l'output per la visualizzazione .... è possibile modificare l'ordine, ma questa è l'idea generale
ErikW

3

Puoi anche recuperare un ritardo usando il comando PING, ad esempio:

@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

Ho avuto lo stesso problema quando ho bisogno di controllare la dimensione del file su un file su cui si sta lavorando attivamente da un altro processo. Ho finito per clonare la funzionalità di watch su Windows. L'esempio compilato e la fonte sono disponibili sul sito.

guardare per Windows


1

Ho creato un comando watch per windows chiamato llwatch.

Il codice è sia sul mio sito web landenlabs.com

e anche su GitHub

Potrebbe essere necessario utilizzare x64 per guardare i programmi x64 e x32 per gli altri. Non sono sicuro di quanto siano esigenti le finestre.


Non sono sicuro del motivo per cui questo è stato downvoted ... Benvenuto in Super User !
jpaugh

1

cosa ha detto @harrymc tranne che con sleep watch.bat

@ECHO OFF
:loop
  %*
  sleep 5
goto loop

./watch.bat npm esegui test

npm run test ogni 5 sec



-1

Avevo fretta .... Ho usato un suggerimento e l'ho cambiato un po 'per funzionare per me:

per / l% g in () do @ (test echo e timeout / t 2)

L'ho cambiato in:

per / l% g in () do @ (test.bat & timeout / t 2)

E ho creato il file test.bat con la riga di comando. Nel mio caso, era:

gruppo / dominio netto

Ho scoperto che il comando echo è appena stato stampato sullo schermo ma non ha eseguito il comando

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.