lio*_*tal 9 windows xcopy cmd.exe
我有 2 个包含文件的文件夹。这些文件是某些构建过程的产物。第一个文件夹是先前构建的输出,而后者是当前构建的输出。
我想以某种方式从命令行/构建脚本中区分这两个文件夹,并仅将添加的文件或新文件复制到其他文件夹中。
例如:
**FOLDER1** (new build)
a.txt
b.txt (modified)
c.txt
d.txt
**FOLDER2** (prev build)
a.txt
b.txt
c.txt
Run Code Online (Sandbox Code Playgroud)
基于此,我感兴趣的复制操作将仅将 b.txt 和 d.txt 复制到其他文件夹中(而不是文件夹 2 中)。
基本上,我只是在“增量”之后,我想将这些存储在某个地方。
这是否可以使用 Windows 附带的标准命令行工具?(假设 Windows 7/Server 2008 或更高版本)
dbe*_*ham 11
使用带有 /D 和 /L 选项的 XCOPY,从文件夹 1“复制”到文件夹 2。
/D 选项将副本限制为仅新文件或修改过的文件。
/L 选项使命令列出将被复制的文件,但阻止实际制作任何副本。
然后使用 FOR /F 处理这些结果并将文件实际复制到文件夹 3。
for /f "eol=: delims=" %F in ('xcopy /dl "folder1\*" "folder2"') do @copy "%F" "f3" >nul
Run Code Online (Sandbox Code Playgroud)
如果放在批处理文件中,则所有文件都%
必须加倍为%%
.
XCOPY 还打印出有多少文件受到(将)影响的摘要。以上将尝试复制摘要计数为“name”的文件,当然会失败。将输出重定向到 nul 可防止显示错误消息。我在 Windows 7 上进行了测试,很惊讶错误消息出现在 stdout 而不是 stderr。如果其他版本的错误信息出现在 stderr 上,那么该命令也应该得到 2>nul 以防止出现错误信息。
但是隐藏错误消息存在风险 - 如果副本由于某种原因失败怎么办?
这是一个脚本,它将列出所有成功复制的文件,并指出哪些(如果有)失败。它使用 FINDSTR 过滤掉不需要的文件数。它假设文件计数是英文的,格式为NNN File(s)
,因此必须针对其他语言进行修改。
@echo off
for /f "eol=: delims=" %%F in (
'xcopy /dl "folder1\*" "folder2" ^| findstr /v "^[0-9][0-9]* File(s)"'
) do copy "%%F" "folder3" >nul && echo "%%F"|| echo FAILED: "%%f"
Run Code Online (Sandbox Code Playgroud)
这是一个适用于任何语言的更复杂的变体。它将每个文件名保存到一个变量中,并将复制延迟到下一次循环迭代。最后一个条目(计数)永远不会被复制。
@echo off
setlocal disableDelayedExpansion
set "file="
for /f "eol=: delims=" %%F in ('xcopy /dl "folder1\*" "folder2"') do (
if defined file (
setlocal enableDelayedExpansion
copy "!file!" "folder3" >nul && echo "!file!" || echo FAILED: "!file!"
endlocal
)
set "file=%%F"
)
Run Code Online (Sandbox Code Playgroud)
小智 5
我更喜欢 ROBOCOPY。使用 XCOPY 多年,然后发现需要通过缓慢/不稳定的互联网连接进行可重新启动的复制操作。
ROBOCOPY src dest /s /e /xo
或镜子
ROBOCOPY src dest /mir
使用“日志记录”选项获取您的列表以供稍后检查。
ROBOCOPY src dest /s /e /xo /log:文件
归档时间: |
|
查看次数: |
39298 次 |
最近记录: |