كيفية رمز الدوار في انتظار العمليات في دفعة الملف ؟

StackOverflow https://stackoverflow.com/questions/368041

  •  21-08-2019
  •  | 
  •  

سؤال

أود أن تظهر للمستخدم مع الدوار ، أن يتم شيء في الخلفية ولكن لا أعرف كيف يعمل هذا في batchfile.

هل من أحد لديه فكرة ؟

هل كانت مفيدة؟

المحلول

ويمكن في الواقع أن يتم ذلك بسهولة تامة مع الأوامر الأصلية نقية، عليك أن تعرف كيفية استخدام أكثر صعبة منهم. لا استخدام أدوات خارجية مثل VBScript أو آثار جانبية سيئة مثل ازالة الشاشة ضرورية.

ما كنت تبحث عن ما يعادل باش قيادة "echo -n" التي إخراج خط بدون السطر الجديد. في دفعة إكس بي، وهذا يتحقق من خلال استخدام "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

نصائح أخرى

وجرب هذا:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CALL :BACKSPACE $BS
SET /A FULL_COUNT=60
SET /A MAX_COUNT=160
SET /A Spin_Delay=50
SET "_MSG=Process running..."
SET /A CTR=0
SET /A TCT=0
IF NOT [%1]==[] SET _MSG=%~1
IF NOT [%2]==[] SET /A FULL_COUNT=%2
IF NOT [%3]==[] SET /A SPIN_DELAY=%3
IF %FULL_COUNT% GTR %MAX_COUNT% SET FULL_COUNT=%MAX_COUNT%
(SET/P=%_MSG%*)<nul
FOR /L %%A IN (1,1,%FULL_COUNT%) DO (
  CALL :DELAY %SPIN_DELAY%
  IF !CTR! EQU 0 (set/p=%$BS%³)<nul
  IF !CTR! EQU 1 (set/p=%$BS%/)<nul
  IF !CTR! EQU 2 (set/p=%$BS%Ä)<nul
  IF !CTR! EQU 3 (set/p=%$BS%\)<nul
  SET /A CTR=%%A %% 4
)
(SET/P=%$BS%*)<nul
ENDLOCAL & EXIT /B %CTR%

:BackSpace
setlocal
for /f %%a in ('"prompt $H$S &echo on &for %%b in (1) do rem"') do set "Bs=%%a"
endlocal&call set %~1=%BS%&exit /b 0

:Delay msec
setlocal enableextensions
set/a correct=0
set/a msecs=%1+5
if /i %msecs% leq 20 set /a correct-=2
set time1=%time: =%
set/a tsecs=%1/1000 2>nul
set/a msecs=(%msecs% %% 1000)/10
for /f "tokens=1-4 delims=:." %%a in ("%time1%") do (
  set hour1=%%a&set min1=%%b&set sec1=%%c&set "mil1=%%d"
)
if /i %hour1:~0,1% equ 0 if /i "%hour1:~1%" neq "" set hour1=%hour1:~1% 
if /i %min1:~0,1% equ 0 set min1=%min1:~1% 
if /i %sec1:~0,1% equ 0 set sec1=%sec1:~1%
if /i %mil1:~0,1% equ 0 set mil1=%mil1:~1% 
set/a sec1+=(%hour1%*3600)+(%min1%*60)
set/a msecs+=%mil1%
set/a tsecs+=(%sec1%+%msecs%/100)
set/a msecs=%msecs% %% 100
::    check for midnight crossing
if /i %tsecs% geq 86400 set /a tsecs-=86400
set/a hour2=%tsecs% / 3600
set/a min2=(%tsecs%-(%hour2%*3600)) / 60
set/a sec2=(%tsecs%-(%hour2%*3600)) %% 60
set/a err=%msecs%
if /i %msecs% neq 0 set /a msecs+=%correct%
if /i 1%msecs% lss 20 set msecs=0%msecs%
if /i 1%min2% lss 20 set min2=0%min2%
if /i 1%sec2% lss 20 set sec2=0%sec2%
set time2=%hour2%:%min2%:%sec2%.%msecs%
:wait
  set timen=%time: =%
  if /i %timen% geq %time2% goto :end
goto :wait
:end
for /f "tokens=2 delims=." %%a in ("%timen%") do set num=%%a
if /i %num:~0,1% equ 0 set num=%num:~1%
set/a err=(%num%-%err%)*10
endlocal&exit /b %err%

إذا كنت لا تمانع في الشاشة المقاصة...جرب هذا:

@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 الموجهات المعياري و STDERR إلى nul شيء حتى من PSLIST سيتم عرضها.

إذا فهمت سؤالك كنت ترغب في الدوار بسبب بعض العمليات التي تقوم بتنفيذ هي أخذ الوقت وتريد أن تظهر للمستخدم أن شيئا ما يحدث، أليس كذلك؟

في هذه الحالة، وبقدر ما أعرف، وليس ممكنا مع الأوامر الأصلية. (يمكن أن يكون ممكنا إذا كان لديك البرنامج الذي أظهر الدوار أثناء تنفيذ العملية التي تستغرق وقتا طويلا)

ويبدو أن صدى لا تدعم الانسي تسلسل الهروب (في الايام الخوالي كان عليك أن يكون لديك تحميل ANSI.SYS، لا أعرف إذا كان هذا لا يزال موجودا) لذلك لا يمكنك استخدام مقاييس التحكم في المؤشر .

الدوار يمكن أن يتم دفعة واحدة النصي, تحتاج فقط بعض المتغيرات:

@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

على الخفافيش نفسها للكشف عن عملية تشغيل/المخارج.يمكنك القيام بذلك عن طريق WMI واجهة سطر الأوامر أو الأمر قائمة المهام التي يجب معرفة محدودة.

لو كانت مرة أخرى في دوس أيام حتى يمكن أن يفعل ذلك دون مسح الشاشة...قصيرة من استخدام مزيج من أحرف الهروب.أنا لا أعرف إذا كان لا يزال ممكنا على Vista/XP.

إذا كنت تعني ضمن برنامج نصي دفعة ويندوز، لا يمكنك أن تفعل ذلك أصلا. والبيان صدى تستخدم الطباعة إلى وحدة طباعة دائما سطر جديد، وأنت لا تستطيع تحريك المؤشر.

وانها قليلا من الإختراق، ولكن يمكنك القيام بذلك مع مزيج من VBScript و دفعة النصي.

وهذا VBScript سيتم طباعة مسافة للخلف، ثم انها حجة:

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، وهذا السيناريو سوف تبدأ آلة حاسبة ويندوز، وعرض الدوار حتى إغلاق الآلة الحاسبة:

@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."

ويمكنك استخدام عداد التي تطبع شخصية مختلفة من مجموعة معينة (مثل "\ | / -") وقمت بتغيير حرف وفقا لمثل "مكافحة مودولو 4". على أي حال، لا نقول في اللغة التي كنت تعمل في ولذلك فمن الصعب قليلا لنكون أكثر دقة.

وتحرير: الآن أن نعرف في أي بيئة كنت تلعب في، وأنا أقول أن اللغة BAT / CMD ليست في الحقيقة على مستوى هذه المهمة ... وأنا أنصح أي لغة البرمجة روبي كونها المفضلة .

وأجد أسهل طريقة لتحديث العنوان -. بهذه الطريقة لم يكن لديك للقيام CLS في كل وقت

والسبب في هذين الخطين من -n بينغ، هو أنه أسرع للتنس للقيام بينغ مزدوجة من الثانية لكل منهما، مقابل بينغ واحد من ثانيتين.

وأيضا، بالنسبة لأولئك الذين لا يعرفون، و:: هو نفس 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

و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

وهذا الروتين يدرس إخراج تاسكليست لعملية تبدأ من كمد.
تمر عليه اسم إكس كمعلمة على سبيل المثال
الاتصال على: الدوار calc.exe تصبح
فإنه تقارير
المنقضي: 001 ثانية
والزيادات ثوان حتى إنهاء عملية إكس.
والكتابة المنقضي 001 ثانية رسالة كل ثانية من ECHO.exe -n \ ص
التي الصدى وكر بدون سطر تغذية.
Echo.exe يتوفر في http://www.paulsadowski.com/wsh/cmdprogs.htm

 @echo off
 start calc
 call :spinner calc.exe
 pause

 :spinner       
 SET COUNT=1
 :BEGIN
 set "formattedValue=000000%count%"
 ECHO.exe -n Elapsed: %formattedValue:~-3% seconds
 ECHO.exe -n \r    %= -n (suppress crlf) \r output a cr =%

 SET /A COUNT+=1

 set EXE=%1    %= search output of tasklist for EXE =%
 set tl=tasklist /NH /FI "IMAGENAME eq %EXE%"
 FOR /F %%x IN ('%tl%') DO IF %%x == %EXE% goto FOUND
 set result=0
 goto FIN
 :FOUND
 set result=1
 :FIN
 IF %result% EQU 0 GOTO END

 PING -n 2 127.0.0.1 > nul    %= wait for about 1 second =%

 GOTO BEGIN
 :END

وبدء التطبيق، الانتظار لتحميل

@echo off & setlocal enabledelayedexpansion
start application.exe
:1
for %%a in (^| ^/ ^- ^\ ^| ^/ ^- ^\) do (
for %%b in (^| ^/ ^- ^\ ^| ^/ ^- ^\) do (
for %%c in (^| ^/ ^- ^\ ^| ^/ ^- ^\) do (
cls &echo processing..%%c%%b%%a
sleep -m 20
IF EXIST "result file" (exit)
)))
goto 1

و: LOOP   ECHOX -n "~ ص تجهيز٪ ..."   IF٪ CTR٪ EQU 4 SET / A CTR = 0   IF٪ CTR٪ == 0 (مجموعة / ص DOT = ³)     

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top