Windows 批处理文件进程纺车

Windows 批处理文件进程纺车,windows,batch-file,cmd,Windows,Batch File,Cmd,我已经尝试了好几天,似乎可以让这个工作。我找到了一个例子,但它使用了一个(CryEcho),它不起作用。我只是想添加它,让用户知道在im ping IP地址时发生了什么。我确实在这里找到了一些代码,但这让我很困惑,因为我只是为了好玩才开始乱搞批处理文件 不管怎样,我想有一些东西,使用下面的例子,但像文本(等待…[spinner])。谢谢 我也发现了这个代码: @echo off rem Example showing how to use CryEcho to produce a spinnin

我已经尝试了好几天,似乎可以让这个工作。我找到了一个例子,但它使用了一个(CryEcho),它不起作用。我只是想添加它,让用户知道在im ping IP地址时发生了什么。我确实在这里找到了一些代码,但这让我很困惑,因为我只是为了好玩才开始乱搞批处理文件

不管怎样,我想有一些东西,使用下面的例子,但像文本(等待…[spinner])。谢谢

我也发现了这个代码:

@echo off
rem Example showing how to use CryEcho to produce a spinning wheel to show activity.

CryEcho Working ... 
call :DoSomeWork
call :SpinAlive
call :DoSomeWork
call :SpinAlive
call :DoSomeWork
call :SpinAlive
call :DoSomeWork
call :SpinAlive
call :DoSomeWork
call :SpinAlive
call :DoSomeWork
call :SpinAlive
call :DoSomeWork
call :SpinAlive
call :DoSomeWork
call :SpinAlive
call :DoSomeWork

cryecho \s\nFinished.

goto :eof

:DoSomeWork
ping -n 1 localhost > nul
goto :eof

:SpinAlive
if "%Spinner%" == "2" (cryecho \\\b) 
if "%Spinner%" == "3" (cryecho -q "|"\b) 
if "%Spinner%" == "4" (cryecho /\b set Spinner=0) else (cryecho -\b set Spinner=1)
set /A Spinner=%Spinner%+1
goto :eof

这里的主要技巧是将光标移回同一行。
这可以通过
回车
退格
字符来完成

@echo off
setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

FOR /L %%n in (1,1,10) DO (
    call :spinner
    ping localhost -n 2 > nul
)
exit /b

:spinner
set /a "spinner=(spinner + 1) %% 4"
set "spinChars=\|/-"
<nul set /p ".=Waiting !spinChars:~%spinner%,1!!CR!"
exit /b
@echo关闭
setlocal EnableDelayedExpansion
对于('copy/Z'%~dpf0“nul')中的/f%%a,请设置“CR=%%a”
对于(1,1,10)DO中的/L%%n(
呼叫:微调器
ping localhost-n2>nul
)
退出/b
:旋转器
设置/a“微调器=(微调器+1)%%4”
设置“spinChars=\\\;/-”
@ECHO关闭
SETLOCAL ENABLEDELAYEDEXPANSION
调用:退格$BS
设置/完整计数=75
设置/A最大计数=160
设置/旋转延迟=60
设置“\u MSG=进程正在运行…”
设置/A中心=0
如果不是[%1]=[]则设置“\u MSG=%~1”
如果不是[%2]=[]设置/A完整计数=%2
如果不是[%3]=[]设置/A旋转延迟=%3
如果%FULL_COUNT%GTR%MAX_COUNT%SET/A FULL_COUNT=%MAX_COUNT%

我想这归结为能够输出一个单独的回车符(没有换行符),我认为这在没有外部工具的纯批处理中是不可能的。@Joey All是可能的:-)几乎每个字符都可以通过
for files
copy
prompt
批量创建,尽管@jeb的答案有点简洁,IMO.@icabod Yes paxdiabolo使用了
退格
,但我不想在批处理文件中嵌入控制字符,因为您需要一个特殊的editorNice解决方案,但在WinXP上,这会为
/
输出
/W
,我想这是因为Win7/Vista的修复程序。一个解决方案(对于XP)是设置:`=!CR!WCR!等待!微调器:~%spinner%,1!“。在Vista/Win7中没有尝试过。谢谢,不过有几个问题。为什么它看起来像(等待/|\W)结尾有一个“W”?还有,(1,1,10)它旋转了多少次?@icabod I修复了输出,@user1875160
(1,1,10)
让/L的
循环计数从1到10icabod,还有一个问题,我如何将其合并到菜单中?我有一个带有9个选项的菜单,可以选择goto。我需要在每个goto中输入代码来显示等待的微调器,还是我可以调用微调器。你能告诉我正确的方向吗?谢谢!@user1875160:你最好问一下杰布,当他发布答案时:)
设置“SPINNER=³/Ä\”
是不正确的。为什么你要做很多事情而他只需要一个纺车?这里不适合只使用代码的结果。一些解释和评论会有所帮助
@echo off
setlocal EnableDelayedExpansion
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

FOR /L %%n in (1,1,10) DO (
    call :spinner
    ping localhost -n 2 > nul
)
exit /b

:spinner
set /a "spinner=(spinner + 1) %% 4"
set "spinChars=\|/-"
<nul set /p ".=Waiting !spinChars:~%spinner%,1!!CR!"
exit /b
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CALL :BACKSPACE $BS
SET /A FULL_COUNT=75
SET /A MAX_COUNT=160
SET /A Spin_Delay=60
SET "_MSG=Process running..."
SET /A CTR=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 /A FULL_COUNT=%MAX_COUNT%
<nul SET/P="%_MSG%*"
SET "SPINNER=³/Ä\"
FOR /L %%A IN (1,1,%FULL_COUNT%) DO (
  CALL :DELAY %SPIN_DELAY%
  <nul CALL SET/P="%$BS%%%SPINNER:~!CTR!,1%%"
  SET /A CTR=%%A %% 4
)
<nul SET/P="%$BS%*"
ENDLOCAL & EXIT /B %CTR%

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

:Delay msec
setlocal
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%