在Windows命令行中复制文件并显示进度

42

我需要使用Windows命令行(默认情况下适用于XP Pro或更高版本)复制文件,并在此过程中显示进度。

进度指示器可以在终端或GUI窗口中显示。它旨在在批处理脚本期间使用。


6
Robocopy在这里是你的朋友。 - Harry Johnston
1
除了Robocopy实际上是一个文件夹复制工具而不是文件复制工具。 - Alan B
7个回答

64

我使用了带有 /z 选项的复制命令来复制网络驱动器上的文件。这个命令也适用于本地驱动器之间的复制。已在 XP Home 版本上测试通过。


3
完美的回答。这很有效,也可以在连接中断时重新启动。我很惊讶以前没有注意到这个功能,谢谢你。 - Justin
任何XP和任何Win7。 - barlop
+1 谢谢 @adrian 它完美地起作用了。但是对于通过网络驱动器复制,它如何表现得好呢?我发现 Robocopy 更适合这些目的。 - Anurag
它在运行Windows 10的USB恢复盘上正常工作。谢谢! - Tarik
易于实现的解决方案,但请记住,这种方法要慢得多。根据@Iconiu答案中的数据,可能慢20倍。 - Ben

21

1
接近了,但在XP上不可用。虽然我会考虑它。 - Steven
这是关于Windows 2003服务器资源工具包的内容。 - Paul Knopf

16

Esentutl的/y选项允许像这样带有进度条的复制(单个)文件:

enter image description here

命令应该如下所示:

esentutl /y "FILE.EXT" /d "DEST.EXT" /o

这个命令在每台Windows机器上都可以使用,但y选项只在Windows Vista中提供。 由于它仅适用于单个文件,对于小文件来说似乎并不是很有用。 另一个限制是该命令不能覆盖文件。这里有一个包装脚本,它会检查目标文件夹,如果需要的话可以将其删除(通过传递/h参数可以查看帮助信息)。


另一个选择是通过PowerShell、JScript或VBScript自动化shell.Application对象。这将允许您在资源管理器弹出窗口显示进度的情况下复制项目。以下是示例脚本和用法:

call shellCopy.bat "D:\Folder\anotherFolder" "C:\Destination"

使用此功能,您可以选择单个文件、目录或使用通配符的文件。但是,如果项目大小太小,则弹出窗口会消失得太快。如果目标中有相同名称的项目,则会在末尾创建一个新项目,并添加 - Copy(因为它是使用右键单击和复制/粘贴使用的)。不过,您可以通过使用官方文档来调整 选项值 并要求覆盖,例如。

enter image description here


如何覆盖目标中的现有文件?我需要手动删除它吗?我在Win7上找不到/o开关。 - PeterCo
@PeterCo 是的,在Win7上有/o开关。Esentutl不能覆盖文件,所以您需要添加一行if exist destination ... - npocmaka

6
一些有趣的时间信息涉及到所有这些方法。如果您拥有千兆连接,则不应使用/z标志,否则它将降低您的连接速度。Robocopy或dism是唯一能够全速运行并显示进度条的工具。wdscase用于从WDS服务器进行多播,如果您正在为5个或更多计算机镜像,则可能更快。要获得1:17的定时,我将千兆连接最大化为920Mbps,因此您无法同时在两个连接上获得该定时。还要注意,导出较大wim文件中的小wim索引比仅复制整个文件需要更长的时间。
Model  Exe       OS       switches     index    size    time   link speed 
8760w  dism      Win8     /export-wim  index 1  6.27GB  2:21   link 1Gbps
8760w  dism      Win8     /export-wim  index 2  7.92GB  1:29   link 1Gbps
6305   wdsmcast  winpe32  /trans-file  res.RWM  7.92GB  6:54   link 1Gbps
6305   dism      Winpe32  /export-wim  index 1  6.27GB  2:20   link 1Gbps
6305   dism      Winpe32  /export-wim  index 2  7.92GB  1:34   link 1Gbps
6305   copy      Winpe32  /z           Whole    7.92GB  25:48  link 1Gbps
6305   copy      Winpe32  none         Wim      7.92GB  1:17   link 1Gbps
6305   xcopy     Winpe32  /z /j        Wim      7.92GB  23:54  link 1Gbps
6305   xcopy     Winpe32  /j           Wim      7.92GB  1:38   link 1Gbps
6305   VBS.copy  Winpe32               Wim      7.92    1:21   link 1Gbps
6305   robocopy  Winpe32               Wim      7.92    1:17   link 1Gbps

如果你没有可用的 robocopy.exe,为什么不从你要复制文件的网络共享中运行它呢?在我的情况下,我更喜欢这样做,这样我就不必每次想要进行更改然后更新几十个闪存驱动器时都要重建我的 WinPE boot.wim 文件。

1

这个技术网站链接提供了一些复制大文件的好资料。我使用了文章中提到的一个交换服务器实用程序,它显示进度并在内部使用非缓冲复制函数以实现更快的数据传输。

在另一种情况下,我使用了Robocopy。 Robocopy GUI使得你更容易正确地设置命令行选项。


0

这是我使用的脚本:

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION
mode con:cols=210 lines=50
ECHO Starting 1-way backup of MEDIA(M:) to BACKUP(G:)...
robocopy.exe M:\ G:\ *.* /E /PURGE /SEC /NP /NJH /NJS /XD "$RECYCLE.BIN" "System Volume Information" /TEE /R:5 /COPYALL /LOG:from_M_to_G.log
ECHO Finished with backup.
pause

0
如果你想复制文件并查看“进度”,我建议使用下面的批处理脚本,这是我从另一个脚本中使用的基础。
在脚本复制游戏文件《核王座》时,我使用了进度条和百分比。
@echo off
title NTU Installer
setlocal EnableDelayedExpansion

@echo Iniciando instalacao...
if not exist "C:\NTU" (
    md "C:\NTU
)
if not exist "C:\NTU\Profile" (
    md "C:\NTU\Profile"
)
ping -n 5 localhost >nul

for %%f in (*.*) do set/a vb+=1
set "barra="
::loop da barra
for /l %%i in (1,1,70) do set "barra=!barra!Û"
rem barra vaiza para ser preenchida
set "resto="
rem loop da barra vazia
for /l %%i in (1,1,110) do set "resto=!resto!"
set i=0
rem carregameno de arquivos
for %%f in (*.*) do (
    >>"log_ntu.css" (
        copy "%%f" "C:\NTU">nul
        echo Copiado:%%f
    )
    cls
    set /a i+=1,percent=i*100/vb,barlen=70*percent/100
    for %%a in (!barlen!) do echo  !percent!%% /                         
    [!barra:~0,%%a!%resto%]
    echo Instalado:[%%f] / Complete:[!percent!%%/100%]
    ping localhost -n 1.9  >nul
)
xcopy /e "Profile" "C:\NTU\Profile">"log_profile.css"              

@echo Criando atalho na area de trabalho...
copy "NTU.lnk" "C:\Users\%username%\Desktop">nul
ping localhost -n 4  >nul

@echo Arquivos instalados!
pause

1
我希望我有所帮助 XD。 - CommanderBoss Ge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接