49

Я ищу Windows программу / скрипт / функцию командной строки, которая работает как программа watch Linux.

watch периодически вызывает другую программу / что угодно и показывает результат, который отлично подходит для обновления выходного файла или подобного каждую секунду:

watch cat my-output.txt

или, более сильно:

watch grep "fail" my-output.txt

Я искал его в библиотеке Cygwin, но, похоже, его нет.

13 ответов13

36

Напиши свое. Допустим, файл watch.bat содержит:

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

и позвоните через, например:

watch echo test

будет повторять test каждые 5 секунд.

24

У Powershell есть команда while. Вы можете использовать его как в Linux:

while (1) {your_command; сон 5}

Версия для Linux:

пока правда; сделать вашу_команду; sleep5; сделанный

Другие:

while ($ true) {netstat -an | findstr 23560; спать 5; Дата}

12

watch доступны в Cygwin, в пакете procps , как указано здесь (эту информацию можно найти через поиск пакетов на веб-сайте здесь). Я не думаю, что этот пакет устанавливается по умолчанию при установке cygwin, но я обычно выбираю его при новой установке, чтобы команда watch была доступна.

Расположение инструментов в пакетах обычно совпадает с именами пакетов в дистрибутивах Linux (пакет, содержащий watch , также работает в Debian и Ubuntu), поэтому, если функция поиска пакетов Cygwin не сработает, информация для / из дистрибутивов Linux может дать подсказки.

10

Общая команда Windows oneliner для этого:

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

Замените «эхо-тест» на команду, которую вы хотите выполнить повторно.

5

Я написал этот небольшой модуль PowerShell, чтобы сделать то, что вы искали. Просто поместите это в

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

и запустить import-module watch в 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
5

Это PowerShell один вкладыш:

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

Вот как я бы сделал это в PowerShell:

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

Состояние в while(1) эквивалентно в while true цикл бесконечно.

3

Вы также можете настроить задержку, используя команду PING, например:

@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

У меня была такая же проблема, когда мне нужно было проверить размер файла, который активно обрабатывается другим процессом. Я закончил клонированием функциональности часов на Windows. Скомпилированный exe, а также источник доступен на сайте.

смотреть для Windows

1

что сказал @harrymc за исключением сна watch.bat

@ECHO OFF
:loop
  %*
  sleep 5
goto loop

./watch.bat npm run test

npm run test каждые 5 секунд

1

Я создал команду наблюдения для окон под названием llwatch.

Код есть и на моем сайте landenlabs.com

а также на GitHub

Возможно, вам придется использовать x64 для просмотра программ x64 и x32 для других. Не уверен, насколько придирчивы окна.

-1

Я торопился.... Я использовал одно предложение и немного изменил его, чтобы он работал на меня:

for /l% g in () do @ (эхо-тест и время ожидания /t 2)

Я изменил это на:

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

И я создал файл test.bat с командной строкой. В моем случае это было:

сетевая группа / домен

Я обнаружил, что команда echo просто распечатала на экране, но не выполнила команду

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .