繁体   English   中英

无需批量创建新行即可更新信息

[英]Update information without creating new line in batch

我一直在处理的脚本读取 CD-ROM 驱动器“i”上的所有文件夹并搜索 mp3 文件,将它们复制到目标“e:\\MP3\\new”。

@ECHO off

setlocal enabledelayedexpansion

cd /d "i:\"
set count=1
for /r %%d in (*.mp3) do (
     set /a count+=1
     )
echo There were %count% files found

set countb=1
for /r %%g in (*.mp3) do (
     set /a countb+=1 
     echo|set /p = File: !countb!/%count% 
     copy "%%g" "e:\MP3\new" > nul
)

endlocal

让我们假设在这个例子中找到了 115 个文件。

我从上面的代码中得到了什么:

找到 115 个文件
文件:1/115 文件:2/115 文件:3/115 文件:4/115 文件:5/115 (...) 文件:115/115

我想要的是:

找到 115 个文件
文件:X/115

每次成功复制 mp3 文件时,X 将在屏幕上不断更新

任何帮助解决这个问题?

首先,您错误地初始化了计数器,它们应该设置为零(如set count=0 )而不是一以获得正确的数字。

其次,您应该将echo|set /p =替换为< nul set /P = ,因为管道 ( | ) 比简单的(输入)重定向( < )慢,因为它会为任一方创建新的cmd实例。

要将命令提示符窗口中的光标移回当前行的开头,您需要先编写回车符。 但是,您不能将此字符用作set /P的第一个字符,因为它将与其他前导空白字符一起被删除。 所以你需要在回车之前另一个不可见的字符不会被删除; 让我们选择退格字符。

因此,固定代码可能如下所示,例如:

@echo off
setlocal EnableDelayedExpansion

rem // Gather the back-space character:
for /F %%B in ('prompt $H ^& for %%Z in ^(.^) do rem') do set "BS=%%B"
rem // Gather the carriage-return character:
for /F %%C in ('copy /Z "%~f0" nul') do set "CR=%%C"

cd /D "I:\"
set /A "count=0"
for /R %%d in ("*.mp3") do (
    set /A "count+=1"
)
echo There were %count% files found.

set /A "index=0"
for /R %%g in ("*.mp3") do (
    set /A "index+=1"
    < nul set /P ="%BS%!CR!File: !index!/%count%"
    copy "%%~g" "E:\MP3\new\" > nul
)

endlocal

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM