Quel est l'analogue Windows de la commande de surveillance Linux?

58

Je cherche un programme / script / fonction de ligne de commande Windows qui fonctionne comme le watchprogramme de Linux .

watch appelle périodiquement un autre programme / quel que soit et affiche le résultat, ce qui est excellent pour actualiser un fichier de sortie ou similaire toutes les secondes:

watch cat my-output.txt

ou, plus puissamment:

watch grep "fail" my-output.txt

Je l'ai cherché dans la bibliothèque de cygwin, mais cela ne semble pas être présent.

PeterJCLaw
la source

Réponses:

14

watchest disponible dans Cygwin, dans le procpspackage indiqué ci - dessous (cette information est disponible via la recherche de package sur le site Web, ici ). Je ne pense pas que ce paquet soit installé avec la configuration par défaut de cygwin, mais c’est celui que j’ai généralement choisi pour les nouvelles installations afin que la commande watch soit disponible.

L'emplacement des outils dans les paquetages correspond généralement aux noms de paquet dans les distributions Linux (le paquet contenant également watchprocps sur Debian et Ubuntu aussi). Ainsi, si la fonction de recherche de paquet Cygwin vous échoue, les informations pour / à partir de distributions Linux peuvent fournir des indices.

David Spillett
la source
47

Écrivez votre propre. Disons que le fichier watch.batcontient:

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

et appelez-le via, par exemple:

watch echo test

fera écho testtoutes les 5 secondes.

harrymc
la source
@Keilaron: Notez que votre modification était mauvaise et que je devais la réparer. S'il vous plaît soyez plus prudent.
Scott
Simple mais génial. Évite d'installer cygwin uniquement pour cette commande unique. Vielen Dank!
Stef
28

Powershell a la commande "while". Vous pouvez l'utiliser comme dans Linux:

tandis que (1) {votre_commande; dormir 5}

Version Linux:

bien que vrai faites votre_commande; sleep5; terminé

Autres:

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

Mikis
la source
4
Vous pouvez simplement utiliser while (1), parce que 1c'est la vérité.
TheQuickBrownFox
1
J'ai également constaté que vous pouvez utiliser "clear" comme dernière déclaration, de sorte qu'elle se comporte davantage comme une montre.
Itmuckel
13

Une commande Windows générique oneliner pour accomplir ceci:

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

Remplacez "echo test" par la commande que vous souhaitez exécuter à plusieurs reprises.

w1mb0r
la source
sympa, simple, une doublure qui fait le tour
user230910
6

J'ai écrit ce petit module PowerShell pour faire ce que vous cherchiez. Il suffit de le mettre dans

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

et courir import-module watchdans 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
la source
1
Cela semble assez beau mais j'encouragerais la fonction à être au format Verb-Noun (par exemple Watch-Command) avec un alias de Watch( Set-Alias -Name Watch -item Watch-Command).
duct_tape_coder
6

Voici comment je le ferais dans PowerShell:

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

La condition while(1)est équivalente à while true, boucler indéfiniment.

Klaypigeon
la source
6

C'est une doublure PowerShell:

while ($true) { <your command here> | Out-Host; Sleep 5; Clear }
ErikW
la source
Je mettrais d' Clearabord.
Sastanin
cela dépend du temps nécessaire à votre commande pour s'exécuter, puis pour afficher ... vous pouvez modifier l'ordre, mais c'est l'idée générale
ErikW
3

Vous pouvez également rattraper un retard en utilisant la commande PING, par exemple:

@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
la source
2

J'ai eu le même problème lorsque j'ai eu besoin de vérifier la taille d'un fichier en cours de traitement par un autre processus. J'ai fini par cloner la fonctionnalité de watch sur Windows. Le fichier compilé ainsi que la source sont disponibles sur le site.

surveillez Windows

garrettg84
la source
1

J'ai créé une commande de surveillance pour Windows appelée llwatch.

Le code est à la fois sur mon site web landenlabs.com

et aussi sur GitHub

Vous devrez peut-être utiliser x64 pour regarder des programmes x64 et x32 pour les autres. Je ne sais pas à quel point les fenêtres sont difficiles.

LanDenLabs
la source
Vous ne savez pas pourquoi cela a été rejeté ... Bienvenue dans Super User !
Jpaugh
1

ce que @harrymc a dit sauf avec sleep watch.bat

@ECHO OFF
:loop
  %*
  sleep 5
goto loop

./watch.bat npm lancer le test

npm run test toutes les 5 secondes

utilisateur2167582
la source
-1

J'étais pressé ... J'ai utilisé une suggestion et l'ai modifiée un peu pour fonctionner pour moi:

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

Je l'ai changé pour:

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

Et j'ai créé le fichier test.bat avec la ligne de commande. Dans mon cas, c'était:

groupe net / domaine

J'ai trouvé que la commande echo venait juste d'être imprimée à l'écran mais n'exécutait pas la commande

Aguilae
la source