Как кодировать счетчик для ожидающих процессов в пакетном файле?

Сделайте так: -

var peoples = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "larry", "dinner": "hummus" }
];

$.each(peoples, function(i, val) {
    $.each(val, function(key, name) {
        if (name === "john")
            alert(key + " : " + name);
    });
});

OUTPUT:

name : john

См. LIVE DEMO

13
задан Oliver Friedrich 15 December 2008 в 11:27
поделиться

9 ответов

Это может на самом деле быть сделано довольно легко с чистыми собственными командами, просто необходимо знать, как использовать более хитрых из них. Нет смысла во внешних инструментах как VBScript или противных побочных эффектах как очистка экрана необходимо.

то, Что Вы ищете, является эквивалентом удара" echo -n" команда, которая производит строку без новой строки. В пакете XP это достигается при помощи" set /p" (попросите у пользователя ответа с подсказкой) с пустым входом следующим образом:

<nul (set /p junk=Hello)
echo. again.

произведет строку "Привет снова". без прошедшей новой строки.

, Что прием (и использование CTRL-H, символ возврата виден в следующем сценарии тестирования, который запускает (один за другим) 10-секундную подзадачу с 20 вторых тайм-аутов и 15-секундную подзадачу с 10 вторыми тайм-аутами.

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

Имеют в виду, что строки ^H в этом сценарии являются на самом деле символами CTRL-H, ^ | является двумя отдельными символами, используемыми для выхода из символа вертикальной черты.

@echo off

:: Localise environment.
setlocal enableextensions enabledelayedexpansion

:: Specify directories. Your current working directory is used
:: to create temporary files tmp_*.*
set wkdir=%~dp0%
set wkdir=%wkdir:~0,-1%

:: First pass, 10-second task with 20-second timeout.
del "%wkdir%\tmp_*.*" 2>nul
echo >>"%wkdir%\tmp_payload.cmd" ping 127.0.0.1 -n 11 ^>nul
echo >>"%wkdir%\tmp_payload.cmd" del "%wkdir%\tmp_payload.flg"
call :monitor "%wkdir%\tmp_payload.cmd" "%wkdir%\tmp_payload.flg" 20

:: Second pass, 15-second task with 10-second timeout.
del "%wkdir%\tmp_*.*" 2>nul:
echo >>"%wkdir%\tmp_payload.cmd" ping 127.0.0.1 -n 16 ^>nul
echo >>"%wkdir%\tmp_payload.cmd" del "%wkdir%\tmp_payload.flg"
call :monitor "%wkdir%\tmp_payload.cmd" "%wkdir%\tmp_payload.flg" 10

goto :final

:monitor
    :: Create flag file and start the payload minimized.
    echo >>%2 dummy
    start /min cmd.exe /c "%1"

    :: Start monitoring.
    ::    i is the indicator (0=|,1=/,2=-,3=\).
    ::    m is the number of seconds left before timeout.
    set i=0
    set m=%3
    <nul (set /p z=Waiting for child to finish: ^|)

    :: Loop here awaiting completion.
    :loop
        :: Wait one second.
        ping 127.0.0.1 -n 2 >nul

        :: Update counters and output progress indicator.
        set /a "i = i + 1"
        set /a "m = m - 1"
        if %i% equ 4 set i=0
        if %i% equ 0 <nul (set /p z=^H^|)
        if %i% equ 1 <nul (set /p z=^H/)
        if %i% equ 2 <nul (set /p z=^H-)
        if %i% equ 3 <nul (set /p z=^H\)

        :: End conditions, complete or timeout.
        if not exist %2 (
            echo.
            echo.   Complete.
            goto :final
        )
        if %m% leq 0 (
            echo.
            echo.   *** ERROR: Timed-out waiting for child.
            goto :final
        )
        goto :loop
:final
endlocal
23
ответ дан paxdiablo 15 December 2008 в 21:27
поделиться
  • 1
    Кроме того, я просто протестировал помещение рычага в /usr/share/git-core/template, и это приводит к тому же самому результату – Geoffrey Bachelet 27 January 2010 в 04:45

Если Вы не возражаете, экран, очищающийся..., пробуют это:

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION
SET COUNT=1

START CALC

:BEGIN
  CLS
  IF !COUNT! EQU 1 ECHO \
  IF !COUNT! EQU 2 ECHO -
  IF !COUNT! EQU 3 ECHO /
  IF !COUNT! EQU 4 ECHO -
  IF !COUNT! EQU 4 (
    SET COUNT=1
  ) ELSE (
    SET /A COUNT+=1
  )
  PSLIST CALC >nul 2>&1
  IF %ERRORLEVEL% EQU 1 GOTO END
GOTO BEGIN

:END

РЕДАКТИРОВАНИЕ: Этот образец запустит Калькулятор и затем отобразит "счетчик", пока Вы не закроете Калькулятор. Я использую pslist для проверки на существование CALC.EXE. > nul 2> & 1 перенаправления STDOUT и STDERR к nul, таким образом, ничто от PSLIST не будет отображено.

4
ответ дан aphoria 15 December 2008 в 21:27
поделиться
  • 1
    Хорошо, это кажется очевидным теперь, когда я должен обновить свою установку Мерзавца! I' m собирающийся пробовать это завтра. Спасибо всем за Ваши ответы и время:-) – Geoffrey Bachelet 27 January 2010 в 09:47

Если я понимаю Ваш вопрос, Вы хотите счетчик, потому что некоторая операция, которую Вы выполняете, занимает время, и Вы хотите показать пользователю, что что-то происходит, правильно?

В этом случае, насколько я знаю, не возможный с собственными командами. (могло быть возможно, если бы у Вас была программа, которая показала счетчик при выполнении операции, которые занимают много времени)

, И похоже, что эхо не поддерживает ansi escape-последовательности (в былые времена, у Вас должен был быть загруженный ansi.sys, не знайте, существует ли это все еще), таким образом, Вы не можете использовать ansi для управления курсором.

2
ответ дан some 15 December 2008 в 21:27
поделиться

Если Вы имеете в виду в рамках сценария пакетной обработки Windows, Вы не можете сделать этого исходно. Оператор эха, используемый для печати к консоли, будет всегда печатать новую строку, и Вы не можете переместить курсор.

Это - определенный взлом, но можно сделать это с комбинацией VBScript и сценария пакетной обработки.

Этот VBScript распечатает клавишу Backspace, затем это - аргумент:

WScript.StdOut.Write(chr(8) & WScript.Arguments(0))

Помещенный это в файл, vbsEcho.vbs, затем называет этот сценарий из Вашего сценария пакетной обработки. Следующий сценарий пакетной обработки будет продолжать отображать счетчик, пока Вы не нажмете CTRL-C:

@echo off

:LOOP
cscript //nologo vbsEcho.vbs "\"
cscript //nologo vbsEcho.vbs "|"
cscript //nologo vbsEcho.vbs "/"
cscript //nologo vbsEcho.vbs "-"
goto :LOOP

РЕДАКТИРОВАНИЕ: Используя некоторые идеи из ответа aphoria, этот сценарий запустит калькулятор Windows и отобразит счетчик, пока калькулятор не закроется:

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION
SET COUNT=1

START CALC

cscript //nologo vbsEcho.vbs "Calculating: \"
:LOOP
IF !COUNT! EQU 1 cscript //nologo vbsEcho.vbs "|"
IF !COUNT! EQU 2 cscript //nologo vbsEcho.vbs "/"
IF !COUNT! EQU 3 cscript //nologo vbsEcho.vbs "-"
IF !COUNT! EQU 4 (
    cscript //nologo vbsEcho.vbs "\"
    set COUNT=1
) else (
    set /a COUNT+=1
)

pslist CALC >nul 2>&1
if %ERRORLEVEL% EQU 1 goto :end

goto :LOOP

:END
cscript //nologo vbsEcho.vbs ". Done."
1
ответ дан Patrick Cuff 15 December 2008 в 21:27
поделиться
  • 1
    Таким образом, это работает правильно с Вашим также - любой OP' s сделал глупую ошибку в тестировании, или ошибка была исправлена, с тех пор 1.6.0 - так как Вы связываетесь с источником, я подозреваю you' ре с помощью довольно новой версии также? – Cascabel 27 January 2010 в 05:45

Можно использовать счетчик, который печатает другой символ от данного набора (как "\|/-"), и Вы изменяете символ согласно подобному "счетчику по модулю 4". Так или иначе Вы не говорите, в котором языке Вы работаете в том, таким образом, немного трудно быть более точным.

РЕДАКТИРОВАНИЕ: теперь, когда мы знаем, в которой среде Вы играете в, я сказал бы, что the Bat / язык CMD не действительно до задачи... Я рекомендовал бы любой язык сценариев, при этом Ruby был бы моим фаворитом.

0
ответ дан Keltia 15 December 2008 в 21:27
поделиться
  • 1
    I' m выполнение 1.6.5.5. У меня есть доступ к другому полю с 1.5.5.6, который копирует рычаг и сохраняет выполнить биты, но, кажется, не выполняет его. – Greg Bacon 27 January 2010 в 06:10

Счетчик CAN быть сделанными в сценарии пакетной обработки, Вам просто нужны некоторые переменные:

@echo off

:spinner
set mSpinner=%mSpinner%.
if %mSpinner%'==..............................' set mSpinner=.
cls
echo %mSpinner%

rem Check if the process has finished via WMIC and/or tasklist.

goto spinner


:exit

Для самой the Bat для обнаружения выполнения/выходов процесса. Можно сделать это через интерфейс командной строки WMI или команду списка задач которого у меня есть ограниченные знания.

, Если это вернулось в дни DOS, Вы могли даже делать это, не очищая экран... за исключением использования некоторой комбинации символов ESC. Я не знаю, возможно ли это все еще на Vista/XP.

1
ответ дан chakrit 15 December 2008 в 21:27
поделиться
  • 1
    Документация здесь больше говорит о включении его в Вашем собственном репозитории, и OP, очевидно, знает об этом. Конечно, можно удалить суффикс из шаблонов в каталоге установки (который является точно, что я уже отправил). – Cascabel 27 January 2010 в 04:33

: ПЕТЛЯ ECHOX -n "~ r% Обработка ..." ЕСЛИ% CTR% EQU 4 SET / A CTR = 0 ЕСЛИ% CTR% == 0 (set / p DOT = ³)

-1
ответ дан 1 December 2019 в 07:28
поделиться

Я считаю, что самый простой способ - обновить заголовок - таким образом вам не придется постоянно выполнять CLS .

Причина для двух строк ping -n в том, что для ping быстрее выполнить двойной ping в секунду каждая по сравнению с одним ping в две секунды.

Также для тех, кто этого не делает. знаете, a :: - то же самое, что и REM, за исключением того, что комментарии игнорируются в начале синтаксического анализатора (я думаю, что это правильное слово), а не в конце. Проще говоря, эта строка игнорируется.

:: begin spin.cmd
@echo off
setlocal

set COUNT=0
set MAXCOUNT=10
set SECONDS=1

:LOOP
title "\"
call :WAIT
title "|"
call :WAIT
title "/"
call :WAIT
title "-"
if /i "%COUNT%" equ "%MAXCOUNT%" goto :EXIT
set /a count+=1
echo %COUNT%
goto :LOOP

:WAIT
ping -n %SECONDS% 127.0.0.1 > nul
ping -n %SECONDS% 127.0.0.1 > nul
goto :EOF

:EXIT
title FIN!
endlocal
:: end spin.cmd
0
ответ дан 1 December 2019 в 07:28
поделиться

paxdiablos имеет удивительный ответ, но необходимость повторять ваши команды в файле полезной нагрузки раздражает. Это трудно читать и трудно отлаживать. Я взял его код и немного изменил его для собственного использования:

@echo off

:: Localise environment.
setlocal enableextensions enabledelayedexpansion

set wkdir=%~dp0%
set wkdir=%wkdir:~0,-1%
set done_flag="%wkdir%\tmp_payload.flg"
set timeout=7


:controller

IF (%1)==() (
    call :monitor step1 "Getting stuff from SourceSafe: "
    call :monitor step2 "Compiling some PHP stuff: "
    call :monitor step3 "Finishing up the rest: "
) ELSE ( goto %1 )

goto final


:step1
::ping for 5 seconds
    ping 127.0.0.1 -n 6 >nul
    del "%wkdir%\tmp_payload.flg"
goto final

:step2
::ping for 10 seconds
    ping 127.0.0.1 -n 11 >nul
    del "%wkdir%\tmp_payload.flg"
goto final

:step3
::ping for 5 seconds
    ping 127.0.0.1 -n 6 >nul
    del "%wkdir%\tmp_payload.flg"
goto final

:monitor
:: Create flag file and start the payload minimized.
:: echo the word "dummy" to the flag file (second parameter)
    echo >>%done_flag% dummy
:: start the command defined in the first parameter
    start /min cmd.exe /c "test2.bat %1"

:: Start monitoring.
::    i is the indicator (0=|,1=/,2=-,3=\).
::    m is the number of seconds left before timeout.
set i=0
set m=%timeout%
set str=%2
for /f "useback tokens=*" %%a in ('%str%') do set str=%%~a

<nul (set /p z=%str%^|)

:: Loop here awaiting completion.
:loop
    :: Wait one second.
    ping 127.0.0.1 -n 2 >nul

    :: Update counters and output progress indicator.
    set /a "i = i + 1"
    set /a "m = m - 1"
    if %i% equ 4 set i=0
    if %i% equ 0 <nul (set /p z=^|)
    if %i% equ 1 <nul (set /p z=/)
    if %i% equ 2 <nul (set /p z=-)
    if %i% equ 3 <nul (set /p z=\)

    :: End conditions, complete or timeout.
    if not exist %done_flag% (
        ::echo.
        echo Complete
        goto :final
    )
    if %m% leq 0 (
        echo.
        echo.   *** ERROR: Timed-out waiting for child.
        goto :final
    )
    goto :loop

:final
endlocal
0
ответ дан 1 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: