На самом деле это можно сделать довольно просто с помощью чисто нативных команд, вам просто нужно знать, как использовать более сложные из них. Нет необходимости использовать внешние инструменты, такие как VBScript или неприятные побочные эффекты, такие как очистка экрана.
То, что вы ищете, является эквивалентом команды bash "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