81 votes

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

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

watch appelle périodiquement un autre programme/quelque chose et affiche le résultat, ce qui est idéal pour rafraîchir 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 il ne semble pas être présent.

1voto

user2167582 Points 245

Ce que @harrymc a dit, mais avec le sommeil watch.bat

@ECHO OFF
:loop
  %*
  sleep 5
goto loop

./watch.bat npm run test

npm run test toutes les 5 secondes

1voto

Giovanni Patruno Points 111

Vous pouvez utiliser cette commande dans Windows cmd (ne fonctionne pas dans powershell) :

for /l %g in () do @( <your-command> & timeout /t 1 > nul )

El /t est en secondes

Cela empêche la commande timeout d'écrire "Waiting for n seconds ...", donc c'est plutôt silencieux.

Si vous voulez aller plus vite qu'une seconde, vous pouvez faire ce qui suit :

for /l %g in () do @( <your-command> & ping 127.0.0.1 -n 1 -w 500 > nul )

0voto

evandrix Points 119

0voto

Wesley Points 101

Quelques améliorations sur l'excellent module PS écrit par johnrizzo1 (voir aquí )

  • Renommé la fonction pour être en ligne avec la convention de dénomination Powershell (comme suggéré par duct_tape_coder)
  • L'intervalle a été déplacé vers le deuxième argument, il est donc facultatif ; la valeur par défaut est de 2 secondes.
  • Récupérez d'abord la sortie de la commande Invoke, puis rafraîchissez l'écran. Cela évite que l'écran ne devienne vide pendant l'exécution de la commande.

    function Watch-Command { [CmdletBinding(SupportsShouldProcess=$True,ConfirmImpact='High')] param ( [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)] [string]$command,

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

    }

-1voto

aguilae Points 1

J'étais pressé.... J'ai utilisé une suggestion et l'ai modifiée un peu pour qu'elle me convienne :

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

Je l'ai changé en :

for /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 :

net group /domaine

J'ai découvert que la commande echo s'affiche à l'écran mais n'exécute pas la commande.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X