快速拷贝复制工具软件@拷贝工具@多线程拷贝@robocopy
文章目录
- refs
- 常见复制工具
- 高速拷贝工具
- 特性对比
- Robocopy👺
- Robocopy工具
- 基本用法
- 语法
- 示例
- 常用选项
- 常见选项列表
- 示例
- 高级用法
- 多线程复制
- 日志记录
- 用例案例
- 直接递归复制大量文件的文件夹
- 多线程复制
- 监视被打开文件文件数
- 复制时排除某个目录
- 排除交接点@跳过无法复制的项目@拒绝访问时跳过
- 跳过报错
- powershell封装robocopy👺
- Copy-Robocopy
- Get-PsIoItemInfo
- FAQ
- 复制指定文件时指定正确的参数
- 复制单个文件
- 不兼容传统的copy用法
- 默认作为目录处理
- 从目录A复制到目录B时不会保留目录A
- 递归复制和指定复制的冲突
- 综合示例
- robocopy 复制符号链接和硬链接问题👺
refs
-
Windows中常用文件拷贝工具的评测和对比-阿里云开发者社区 (aliyun.com)
-
如何使用Robocopy多线程功能加速Windows 中的文件复制 - 系统极客 (sysgeek.cn)
-
SMB 文件服务器的性能优化 | Microsoft Learn
常见复制工具
高速拷贝工具
推荐Robocopy,Rclone
-
Robocopy | Microsoft Learn
-
GitHub - rclone/rclone: “rsync for cloud storage” - Google Drive, S3, Dropbox, Backblaze B2, One Drive, Swift, Hubic, Wasabi, Google Cloud Storage, Azure Blob, Azure Files, Yandex Files
特性对比
- 表格内容可能会过时,部分特性随着软件更新发生变换
- 表格中我仅使用过前几款,后面的为验证
工具名称 | 多线程支持 | 价格 | 跨平台性 | 易用性 | 断点续传 | 文件校验 | 是否有图形界面 | 备注 |
---|---|---|---|---|---|---|---|---|
Windows 资源管理器 | 否 | 免费 | 仅限Windows | 非常易用 | 否 | 否 | 是 | 系统自带,适合简单文件复制 |
Robocopy | 是 | 免费 | 仅限Windows | 中等 | 是 | 是 | 否 | 命令行工具,适合高级用户 |
Rclone | 是 | 免费 | 跨平台(Win, Mac, Linux) | 中等 | 是 | 是 | 否 | 强大的命令行工具,支持多种云存储 |
FastCopy | 是 | 免费 | Windows, Linux | 中等 | 是 | 是 | 是 | 提供GUI和命令行界面,速度快 |
TeraCopy | 是 | 免费/付费版 | 仅限Windows | 易用 | 是 | 是 | 是 | 提供GUI界面,付费版功能更多 |
FreeFileSync | 是 | 免费 | 跨平台(Win, Mac, Linux) | 中等 | 是 | 是 | 是 | 同步功能强大 |
rsync | 是 | 免费 | 跨平台(Win*, Mac, Linux) | 中等 | 是 | 是 | 否 | 需通过Cygwin等在Windows上使用 |
SyncBack | 是 | 免费/付费版 | 仅限Windows | 易用 | 是 | 是 | 是 | 界面友好,适合备份和同步任务 |
Beyond Compare | 是 | 付费 | 跨平台(Win, Mac, Linux) | 易用 | 是 | 是 | 是 | 强大的比较和同步功能 |
Robocopy👺
-
简单使用演示:备份杀手锏robocopy使用秘籍——程序员小Tips第一期_哔哩哔哩_bilibili
-
最重要的特性莫过于多线程复制了,如果您仅对快速复制和多线程复制特性感兴趣,跳转到powershell封装一节,直接使用封装后的命令,和powershell自带的copy同样直观和易用
Robocopy工具
Robocopy(Robust File Copy)是Windows的一个命令行工具,用于高效地复制、移动和同步文件和目录。与传统的复制命令相比,Robocopy具有更强大的功能和更高的灵活性。
- 可指定多线程复制
- 镜像备份功能(可能会删除文件)
- 可以指定复制软链接是如何处理
- 提供了移动选项,可以用作移动工具
- 控制IO速率
- 复制文件属性,访问控制权限等信息
于此同时,Robocopy的部分选项有删除的效果,因此要小心使用(比如/Mir
镜像功能,可以用于备份,但不推荐多人使用)
以下仅介绍核心用法
基本用法
语法
robocopy <Source> <Destination> [<File>[ ...]] [<Options>]
- Source:源目录路径。
- Destination:目标目录路径。
- File:要复制的文件,可以使用通配符(例如
*.*
)。 - Options:可选参数,用于控制复制行为。
PS C:\Users\cxxu> robocopy /?-------------------------------------------------------------------------------ROBOCOPY :: Windows 的可靠文件复制
-------------------------------------------------------------------------------用法 :: ROBOCOPY source destination [file [file]...] [options]源 :: 源目录(驱动器:\路径或\\服务器\共享\路径)。目标 :: 目标目录(驱动器:\路径或\\服务器\共享\路径)。文件 :: 要复制的文件(名称/通配符: 默认为 "*.*")。
参数 | 描述 |
---|---|
<source> | 指定源目录的路径。 |
<destination> | 指定目标目录的路径。 |
<file> | 指定要复制的一个或多个文件。 支持通配符(***** 或 ?)。 如果未指定此参数,*.* 将用作默认值。 |
<options> | 指定要与 robocopy 命令结合使用的选项,包括复制、文件、重试、日志记录和作业选项。 |
示例
-
文件夹的基本复制
将
C:\Source
目录中的所有文件(但不包括子目录及其文件,也就是默认跳过对子目录的处理)复制到D:\Destination
目录(这种用法比较少,一般用普通的copy命令就行)robocopy C:\Source D:\Destination
如果要一同处理子目录,那么需要使用
/E
选项,类似于启用递归复制的效果(Copy-Item -Reverse
) -
复制特定文件类型
只复制
C:\Source
目录中的.txt
文件到D:\Destination
目录:robocopy C:\Source D:\Destination *.txt
这可以指定复制特定文件,但是要注意避免和
/E
等选项冲突
常用选项
常见选项列表
选项 | 说明 |
---|---|
/S | 复制子目录,但不包括空的子目录 |
/E | 复制所有子目录,包括空的子目录 |
/MIR | 镜像目录树(等同于 /E 和 /PURGE ) |
/COPY | 复制文件的数据、时间戳、权限等,默认值为 DAT |
/MOV | 移动文件(复制后删除源文件) |
/MOVE | 移动文件和目录(复制后删除源目录和文件) |
/R:n | 出错重试次数,默认值为1,000,000次 |
/W:n | 每次重试等待时间(秒),默认值为30秒 |
/LOG:file | 将输出结果记录到指定的日志文件 |
/NP | 不显示复制进度百分比 |
示例
-
复制目录结构
复制
C:\Source
目录及其所有子目录(包括空的子目录)到D:\Destination
:robocopy C:\Source D:\Destination /E
-
镜像同步
将
C:\Source
目录镜像同步到D:\Destination
,使目标目录与源目录完全一致:robocopy C:\Source D:\Destination /MIR
-
移动文件
将
C:\Source
目录中的所有文件和目录移动到D:\Destination
:robocopy C:\Source D:\Destination /MOVE
高级用法
多线程复制
使用 /MT
选项可以启用多线程复制,提高复制速度。可以指定线程数(最大为128):
robocopy C:\Source D:\Destination /MT:16
日志记录
使用 /LOG
选项将复制结果记录到日志文件,便于后续分析:
robocopy C:\Source D:\Destination /LOG:C:\temp\rbcopy_log.txt
用例案例
直接递归复制大量文件的文件夹
PS C:\repos\scripts> robocopy X:\repos\scripts C:\repos\scripts /E-------------------------------------------------------------------------------ROBOCOPY :: Windows 的可靠文件复制
-------------------------------------------------------------------------------开始时间: 2024年8月2日 12:45:13源: X:\repos\scripts\目标: C:\repos\scripts\文件: *.*选项: *.* /S /E /DCOPY:DA /COPY:DAT /R:1000000 /W:30------------------------------------------------------------------------------9 X:\repos\scripts\新目录 7 X:\repos\scripts\.git\
100% 新文件 43 COMMIT_EDITMSG
100% 新文件 279 config
100% 新文件 73 description
.....
.....(好多日志)
.....新目录 1 X:\repos\scripts\sample1\obj\Debug\net8.0\refint\
100% 新文件 5120 sample1.dll新目录 1 X:\repos\scripts\software_crack_scripts\
100% 新文件 504 reset_navicat_try.bat新目录 1 X:\repos\scripts\vba\
100% 新文件 877 saveAs.vba------------------------------------------------------------------------------总数 复制 跳过 不匹配 失败 其他目录: 516 515 1 0 0 0文件: 4026 4016 9 0 1 0字节: 60.16 m 60.12 m 37.9 k 0 908 0时间: 0:00:48 0:00:22 0:00:00 0:00:26速度: 2,782,545 字节/秒。速度: 159.219 MB/分钟。已结束: 2024年8月2日 12:46:02
平均速度大约是2.78MB/s
,总共复制了60.16m字节的数据
开始时间和介绍时间分别为12:45:13
,12:46:02
,差值为49秒
多线程复制
其他条件基本相同的情况下(下面的例子是几个小时后测试的),和上面的例子一样,复制同一个文件夹
现在使用/MT
多线程选项,并结合日志控制和重定向,来看看会不会有更快的速度
robocopy X:\repos\scripts C:\repos\scripts_bak /E /NP /NFL /ETA /MT:16
- 可以追加跟踪
cat C:\temp\rbcopy_log.txt -wait
PS C:\Users\cxxu> robocopy X:\repos\scripts C:\repos\scripts_bak /E /TEE /LOG:C:\temp\robocopy_log.txt /NFL /ETA /MT:16 /R:1 /W:0日志文件: C:\temp\robocopy_log.txt-------------------------------------------------------------------------------ROBOCOPY :: Windows 的可靠文件复制
-------------------------------------------------------------------------------开始时间: 2024年8月2日 15:15:06源: X:\repos\scripts\目标: C:\repos\scripts_bak\文件: *.*选项: *.* /NFL /TEE /S /E /DCOPY:DA /COPY:DAT /ETA /MT:16 /R:1 /W:0------------------------------------------------------------------------------0%
2024/08/02 15:15:07 错误 2 (0x00000002) 正在更改文件属性 X:\repos\scripts\ModulesByCxxu\Startup\startup.lnk
系统找不到指定的文件。0% 正在等待 0 秒... 正在重试...
2024/08/02 15:15:10 错误 2 (0x00000002) 正在更改文件属性 X:\repos\scripts\ModulesByCxxu\Startup\startup.lnk
系统找不到指定的文件。错误: 超过重试限制。------------------------------------------------------------------------------总数 复制 跳过 不匹配 失败 其他目录: 516 516 0 0 0 0文件: 4026 4025 0 0 1 0字节: 60.16 m 60.16 m 0 0 908 0时间: 0:00:55 0:00:03 0:00:00 0:00:00速度: 16,894,968 字节/秒。速度: 966.738 MB/分钟。已结束: 2024年8月2日 15:15:10
由于这个文件夹存在2个快捷方式权限特殊,复制过程中遇到了属性错误,但是不影响总体的复制效果
平均速度大约是16.9MB/s
,总共复制了60.16m字节的数据
开始时间和介绍时间分别为15:15:06
,15:15:10
,差值为4秒
可以看到,robocopy启用多线程复制众多小文件的速度十分的快速(本次试验中,效果相比于默认的单线程速度有了一个数量级左右的提高)
监视被打开文件文件数
上面的试验是我利用虚拟机,通过挂载局域网内的smb共享文件夹复制一个git仓库的试验
在使用/MT:16
多线程选项复制过程中,我趁机在smb服务器端使用Get-smbSession
查看到了某个瞬间有462个资源处于操作状态状态
PS C:\temp> Get-SmbSessionSessionId ClientComputerName ClientUserName NumOpens
--------- ------------------ -------------- --------
721554505741 192.168.37.129 CXXUCOLORFUL\smb 462
复制时排除某个目录
例如复制一个git仓库,排除.git
目录
robocopy "X:\repos\configs" "C:\repos\configs_bak" /XD ".git" /TEE /LOG:C:\temp\robocopy_log.txt /MT:16 /R:0 /S
排除交接点@跳过无法复制的项目@拒绝访问时跳过
复制选项 | 说明 |
---|---|
/sj | 将交接点(软链接)复制到目标路径而不是链接目标。 |
/sl | 不是接在符号链接的后面,而是创建链接的副本。 |
文件选项(交接点排除) | 说明 |
---|---|
/xj | 排除交接点(通常默认会包含)。 |
/xjd | 排除目录的交接点。 |
/xjf | 排除文件的交接点。 |
跳过报错
- 使用
/R:0
选项即可(直接跳过报错部分)
robocopy X:\repos\scripts C:\repos\scripts_bak /E /TEE /LOG:C:\temp\robocopy_log.txt /NFL /ETA /MT:16 /R:1 /W:0
powershell封装robocopy👺
- 帮助用户更加容易的使用robocopy的核心功能(多线程复制和递归复制),作为常规copy命令的一个补充
- 而简单的单文件复制一般用普通的copy命令就足够方便快捷了
Copy-Robocopy
- 下面这个函数需要调用辅助函数
Get-PsIoItemInfo
function Copy-Robocopy
{<# .Synopsis对多线程复制工具Robocopy的简化使用封装,使更加易于使用,语法更加接近powershell命令默认启用多线程复制,如果需要递归,需要手动启用-Recurse选项.DESCRIPTION- 帮助用户更加容易的使用robocopy的核心功能(多线程复制和递归复制),作为常规copy命令的一个补充- 而简单的单文件复制一般用普通的copy命令就足够方便快捷了如果需要输出日志,使用LogFile参数指定日志文件.EXAMPLE#robocopy 原生用法常见语法用例举例robocopy C:\source\folder\path\ D:\destination\folder\path\ /E /ZB /R:5 /W:5 /V /MT:32.ExAMPLEPS C:\Users\cxxu\Desktop> copy-Robocopy -Source .\dir4 -Destination .\dir1\ -RecurseThe Destination directory name is different from the Source directory name! Create the Same Name Directory? {Continue? [y/n]} : yExecuting: robocopy ".\dir4" ".\dir1\dir4" /E /MT:16 /R:1 /W:1
#>[CmdletBinding()]param (#第一批参数[Parameter(Mandatory = $true, Position = 0)]$Source,[Parameter(Mandatory = $true, Position = 1)]$Destination,[Parameter(Position = 2)][string[]]$Files = '',[int]$Threads = 16, #默认是8[switch]$Recurse,# 控制失败时重试的次数和时间间隔(一般不用重试,基本上都是权限问题或者符号所指的连接无法访问或找不到)$Retry = 1,$Wait = 1,# 第二批$ExcludeDirs = '',$ExcludeFiles = '',[switch]$RecurseWithoutEmptyDirs,[switch]$ContinueIfbroken,# 第三批[switch]$Mirror,[switch]$Move,[switch]$NoOverwrite,[switch]$V,[string]$LogFile,[string[]]$OtherArgumentList)# Construct the robocopy command# 确保source和destination都是目录if (Test-Path $Source -PathType Leaf){Throw 'Source must be a Directory!'}if (Test-Path $Destination -PathType Leaf){throw 'Destination must be a Directory!'}Write-Host 'checking directory name...'#向用户展示参数设置$PSBoundParameters # 这里要求$source和$destination在函数参数定义出不可以定为String类型,会导致Get-PsIOItemInfo返回值无法正确赋值$Source = Get-PsIOItemInfo $Source$destination = Get-PsIOItemInfo $Destination# 检查目录名是否相同(basename)if ($Source.name -ne $destination.name){$continue = Confirm-UserContinue -Description 'The Destination directory name is different from the Source directory name! Create the Same Name Directory?'if ($continue){$Destination = Join-Path $Destination $Source.name}}#debug# return$robocopyCmd = "robocopy `"$Source`" `"$Destination`" $Files"if ($Mirror){$robocopyCmd += ' /MIR'}if ($Move){$robocopyCmd += ' /MOVE'}if ($NoOverwrite){$robocopyCmd += ' /XN /XO /XC'}if ($Verbose){$robocopyCmd += ' /V'}if ($LogFile){$robocopyCmd += " /LOG:`"$LogFile`""}# if ($Threads -gt 1)# {# $robocopyCmd += " /MT:$Threads"# }if ($OtherArgumentList){$robocopyCmd += ' ' + ($OtherArgumentList -join ' ')}if ($Recurse){$robocopyCmd += ' /E'}if ($ContinueIfbroken){$robocopyCmd += ' /Z'}if ($RecurseWithoutEmptyDirs){$robocopyCmd += ' /S'}if ($ExcludeDirs){$robocopyCmd += " /XD $ExcludeDirs"}if ($ExcludeFiles){$robocopyCmd += " /XF $ExcludeFiles"}# 默认使用(每个参数前有一个空格分割)$robocopyCmd += " /MT:$Threads"$robocopyCmd += " /R:$Retry /W:$Wait"# Invoke the robocopy commandWrite-Host "Executing: $robocopyCmd"Invoke-Expression $robocopyCmd
}
Get-PsIoItemInfo
- 上面的
Copy-Robocopy
调用到了这个辅助函数
function Get-PsIOItemInfo
{<# .SYNOPSIS获取文件或目录的.Net对象(路径对象),传入的Path对应的是文件,则返回[System.IO.FileInfo]对象,传入的Path对应的是目录,则返回[System.IO.DirectoryInfo]对象.EXAMPLE获取某个目录的路径对象PS C:\repos\scripts> Get-PsIOItemInfo ./ Mode LastWriteTime Length Name---- ------------- ------ ----da--- 2024/7/29 23:23 scriptsPS [C:\repos\scripts]> Get-PsIOItemInfo .\PS\Mode LastWriteTime Length Name---- ------------- ------ ----da--- 2024/7/29 9:10 PS.EXAMPLEPS [C:\repos\scripts]> (Get-PsIOItemInfo .\PS\).fullnameC:\repos\scripts\PS\.EXAMPLE获取某个文件的路径对象PS [C:\repos\scripts]> Get-PsIOItemInfo .\readme_zh.mdMode LastWriteTime Length Name---- ------------- ------ -----a--- 2024/7/29 21:58 581 readme_zh.md#>[CmdletBinding()]param([Parameter(Mandatory = $true)][string]$Path)if (Test-Path $Path){if (Test-Path $Path -PathType Leaf){# 如果是文件,返回 [System.IO.FileInfo] 对象return [System.IO.FileInfo]::new($Path)}elseif (Test-Path $Path -PathType Container){# 如果是目录,返回 [System.IO.DirectoryInfo] 对象return [System.IO.DirectoryInfo]::new($Path)}}else{Write-Error "The path '$Path' does not exist."}
}
FAQ
复制指定文件时指定正确的参数
复制单个文件
**** /MIR 可以删除文件也可以复制文件!
PS C:\Users\cxxu> robocopy X:\exes C:\exes pwsh7.4.4.msi /Z /ETA /MT:16-------------------------------------------------------------------------------ROBOCOPY :: Windows 的可靠文件复制
-------------------------------------------------------------------------------开始时间: 2024年8月2日 14:53:03源: X:\exes\目标: C:\exes\文件: pwsh7.4.4.msi选项: /DCOPY:DA /COPY:DAT /Z /ETA /MT:16 /R:1000000 /W:30------------------------------------------------------------------------------100% 新文件 103.3 m X:\exes\pwsh7.4.4.msi------------------------------------------------------------------------------总数 复制 跳过 不匹配 失败 其他目录: 1 1 1 0 0 0文件: 1 1 0 0 0 0字节: 103.38 m 103.38 m 0 0 0 0时间: 0:00:05 0:00:01 0:00:00 0:00:01速度: 78,554,156 字节/秒。速度: 4,494.905 MB/分钟。已结束: 2024年8月2日 14:53:06
可以看到任务开始时间和结束时间,它们做差是3秒钟
不兼容传统的copy用法
- 对于传统的copy用法(比如powershell中的copy命令,复制特定文件的语法不同,直接在source处指定源文件而非源文件夹会出错,同样的,在destination处直接指定复制后的文件名也会出错)
默认作为目录处理
- 从下面的错误示例可以看出,source,destination位置处的参数被当成文件夹来处理而不是识别为文件
PS C:\Users\cxxu> robocopy X:\exes\pwsh7.4.4.msi C:\exes\pwsh7.msi /ETA /MT:16-------------------------------------------------------------------------------ROBOCOPY :: Windows 的可靠文件复制
-------------------------------------------------------------------------------开始时间: 2024年8月2日 13:11:54源: X:\exes\pwsh7.4.4.msi\目标: C:\exes\pwsh7.msi\文件: *.*选项: *.* /S /E /DCOPY:DA /COPY:DAT /ETA /MT:16 /R:1000000 /W:30------------------------------------------------------------------------------2024/08/02 13:11:54 错误 267 (0x0000010B) 正在访问源目录 X:\exes\pwsh7.4.4.msi\
目录名称无效。
从目录A复制到目录B时不会保留目录A
- 和powershell自带的
copy
命令不同,使用robocopy A B
复制时(使用递归复制/E
),会将A
目录中的文件和子目录复制到B
中,也就是说A
中的文件或子目录直接挂在B
下面- 举例来说,
A
目录下有个a.txt
文件,那么经过上述复制,目录B
中会有a.txt
,但是不会隔着一层A
目录
- 举例来说,
- 这种行为有时会造成困扰,例如目录A是某个便携版软件的目录,B目录中有很多其他文件和子目录,如果用上面的方法复制,那么目录B中其他文件会和目录A中的文件混在一起,导致目录B内的结构发生混乱难以维护且容易造成冲突!
- 如果要保留复制到B目录中的A目录层级,可以改为
robocopy A B\A
,这样目录A复制到B中时,新文件就会挂在B\A
目录下
递归复制和指定复制的冲突
- 如果要复制指定文件,那么不要使用
/S,/E
这类选项,会冲掉指定的文件,而仍然执行递归复制
robocopy X:\exes\ C:\exes\ pwsh7.4.4.msi /E /ETA /MT:16
您在命令中使用了 /E
选项,这会导致 Robocopy 复制源目录 X:\exes\
下的所有子目录和文件,而不仅仅是指定的 pwsh7.4.4.msi
文件。
为了仅复制 pwsh7.4.4.msi
文件,不要使用 /E
选项。下面是修正后的命令:
robocopy X:\exes\ C:\exes\ pwsh7.4.4.msi /ETA
这样就只会复制指定的文件 pwsh7.4.4.msi
,而不会包括子目录。
完整命令的解释:
X:\exes\
是源目录。C:\exes\
是目标目录。pwsh7.4.4.msi
是要复制的文件。/ETA
显示估计完成时间。
如果您需要记录日志或其他选项,可以添加相应的选项。例如:
robocopy X:\exes\ C:\exes\ pwsh7.4.4.msi /ETA /LOG:C:\temp\rbcopy_log.txt /NP
此命令将 pwsh7.4.4.msi
文件从 X:\exes\
目录复制到 C:\exes\
目录,并将输出记录到日志文件中,同时不显示进度百分比。
综合示例
以下是一个综合示例,将以上改进和查看进度的方法结合起来:
robocopy C:\Source D:\Destination /E /NP /LOG:C:\temp\rbcopy_log.txt /NFL /NDL /ETA /MT:16 /ZB
/E
:复制所有子目录,包括空的子目录。/NP
:不显示进度百分比。/LOG:C:\temp\rbcopy_log.txt
:将输出记录到日志文件(有可能缺少权限而无法写入)。- 可以选择
/NFL
和/NDL
:禁用文件和目录列表的输出。/ZB
:/ETA
:显示估计完成时间。/MT:16
:启用16个线程进行多线程复制。
这种配置可以最大限度地减少终端输出,记录详细的日志,并且显示估计完成时间,同时提高复制速度。
robocopy 复制符号链接和硬链接问题👺
-
如果你了解并会在windows上创建硬链接或符号链接或链接点,在使用robocopy复制的文件夹内包含相关符号时可能会出现符号定位错误
-
例如,我使用windows的SMB共享文件夹功能,将目录
C:\share
做了共享设置,在另一台设备上可以访问该共享文件夹,并将其挂载为网络驱动器(比如盘符为X:
),可用net use X: \\server\shareName
来挂载 -
假设
C:\share
目录中有一个文件Fhard.txt
是C:\share
之外的目录的某个文件F.txt
的硬链接,使用robocopy直接复制就会出错 -
比如通过以下powershell命令行
#当前工作目录是用户家目录下的桌面目录,将桌面上的一个F.txt创建一个硬链接放到 C:\share\demohard.ps1 PS [C:\Users\cxxu\Desktop]> new-Item -itemtype hardlink -path C:\share\demohard.ps1 -Value ./demo.ps1Directory: C:\shareMode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2024/8/2 21:22 4 demohard.ps1
-
-
可能的原因分析:
-
由于这里是通过SMB客户机(简称为SMB client或client)上挂载共享文件为网络驱动器盘符
X:
,能够看到的文件范围局限于SMB服务端(简称SMB server或server)的C:\share
目录下的内容(而server的C:
目录下的非share
子目录是无法被client所访问) -
也就造成了如果server端中的C:\share目录包含了其他目录的文件的硬链接,那么使用robocopy复制这类"文件"(符号)时,会由于链接(符号)所指的文件位于其他不可被client所访问的目录下,就会造成错误
-
PS> robocopy X:\ C:\temp demohard.ps1 /V-------------------------------------------------------------------------------ROBOCOPY :: Windows 的可靠文件复制 -------------------------------------------------------------------------------开始时间: 2024年8月2日 23:11:13源: X:\目标: C:\temp\文件: demohard.ps1选项: /V /DCOPY:DA /COPY:DAT /R:1000000 /W:30------------------------------------------------------------------------------1 X:\新文件 4 demohard.ps1 2024/08/02 23:11:13 错误 2 (0x00000002) 正在更改文件属性 X:\demohard.ps1 系统找不到指定的文件。
-
-
-
而引起robocopy错误的硬链接是这样被创建出来的:
-
假设被复制的文件夹中包含了一个硬链接,这会导致默认的robocopy复制出错
-
....powershell\scripts_readme.md2024/08/02 22:08:41 错误 2 (0x00000002) 正在更改文件属性 X:\repos\blogs\Code\CommandLine命令行\powershell\scripts_readme.md 系统找不到指定的文件。
-
-
如果硬链接的源头是client可以访问的目录,那么robocopy复制它时就不会报错
#在C:\share这个共享文件夹内实验硬链接,创建,然后用robocopy复制,检查是否会发生找不到文件的错误 PS [C:\share]> new-item -itemtype hardlink -path ./others/Fhard.txt -Target .\F.txtDirectory: C:\share\othersMode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2024/8/2 23:12 11 Fhard.txt
顺利复制:
PS> robocopy X:\others C:\temp Fhard.txt-------------------------------------------------------------------------------ROBOCOPY :: Windows 的可靠文件复制 -------------------------------------------------------------------------------开始时间: 2024年8月2日 23:14:39源: X:\others\目标: C:\temp\文件: Fhard.txt选项: /DCOPY:DA /COPY:DAT /R:1000000 /W:30------------------------------------------------------------------------------1 X:\others\ 100% 新文件 11 Fhard.txt------------------------------------------------------------------------------
相关文章:
快速拷贝复制工具软件@拷贝工具@多线程拷贝@robocopy
文章目录 refs常见复制工具高速拷贝工具特性对比 Robocopy👺Robocopy工具基本用法语法示例 常用选项常见选项列表示例 高级用法多线程复制日志记录 用例案例直接递归复制大量文件的文件夹多线程复制监视被打开文件文件数 复制时排除某个目录排除交接点跳过无法复制的…...
JavaScript 逆向爬取实战
准备介绍: 当我们学习完整个 JS 逆向技巧后,这里是一次完整的分析爬取实战 案例介绍 本节案例网站不仅在 API 参数有加密, 而且前端 JS 也带有压缩混淆,其前端压缩打包工具使用 webpack , 混淆工具使用 javascript-obfuscator 。…...
Vue 项目中导入文件时如何默认找寻该文件夹下的 index.vue 文件
文章目录 需求分析 需求 如下图,在Vue 项目中导入 frequencyChange 文件夹时如何默认找寻该文件夹下的 index.vue 文件 分析 确保项目结构和命名约定 首先,确保你的 Vue 单文件组件按照约定命名,例如: components/Example/inde…...
Idea2023.3.3 —— SourceTree与gitee关联
SourceTree SourceTree链接: https://pan.baidu.com/s/1oqPxhpHeNOOiuRRQydes6g?pwdngru 提取码: ngru 点击Generate 分别保存私钥和公钥 gitee官网注册 这是gitee的公钥,与上面SourceTree的公钥私钥不一样 gitee生成公钥,确保本地安装好git git链接: h…...
一文HDMI (High-Definition Multimedia Interface)
HDMI(High-Definition Multimedia Interface,高清多媒体接口)是一种紧凑的音视频接口,它能够将未压缩的视频数据以及压缩或未压缩的数字音频数据,从符合HDMI标准的源设备无缝传输到兼容的计算机显示器、视频投影仪、数…...
【HBZ分享】高并发下如何设计缓存来提升系统性能?
普通模式 普通模式即前段调用后端接口,然后后端先查缓存, 查不到的情况下再查数据库,然后把数据库中的内容放到缓存中。瓶颈:瓶颈在于tomcat的性能,一般并发可以,面临海量并发冲击,tomcat就显得…...
【AI 绘画】 文生图图生图(基于diffusers)
AI 绘画- 文生图&图生图(基于diffusers) 1. 效果展示 本次测试主要结果展示如下: SDXL文生图 可爱Lora 2. 基本原理 模型基本原理介绍如下 stable diffusion首先训练一个自编码器,学习将图像数据压缩为低维表示。通过使…...
已解决HarmonyOS模拟器卡顿问题
以下是一些可以尝试用来解决 HarmonyOS 模拟器卡顿问题的方法: 一、检查系统资源占用 关闭不必要的后台程序 在电脑上,通过任务管理器(Windows 系统中按 Ctrl Shift Esc,Mac 系统通过活动监视器)查看并关闭占用大量 …...
C++ | 深入理解C++中的特殊类设计和单例模式(懒汉模式、饿汉模式)
目录 特殊类设计和单例模式 1、不可拷贝类 2、只能在堆上创建对象的类 3、只能在栈上创建对象的类 4、不可继承的类 5、单例模式(懒汉模式、饿汉模式) 特殊类设计和单例模式 在C编程中,类的设计往往需要满足特定的需求和约束。特殊类设计模式提供了一种方法来…...
Java设计模式之中介者模式
Java设计模式之中介者模式 在软件开发中,设计模式是解决常见问题的最佳实践。通过运用设计模式,我们可以提高代码的可维护性、可扩展性以及可读性。今天,我们将探讨一种非常重要的行为型设计模式——中介者模式(Mediator Pattern…...
实现父组件调用子组件方法时报错:[Vue warn]: Invalid vnode type when creating vnode: null.
使用uniapp实现父组件调用子组件方法时报错:[Vue warn]: Invalid vnode type when creating vnode: null. 实现代码如下: 子组件: <template><view><view class"toolsHeader"><view class"toolsTitl…...
Java面试八股之什么是消息队列
什么是消息队列 消息队列(Message Queue)是一种应用程序间通信(IPC)的形式,它允许进程将消息发送到另一个消息队列,接收端则可以在任何时刻从队列中取出这些消息进行处理。消息队列提供了一种异步处理、解…...
【kubernetes】k8s配置资源管理
一、ConfigMap资源配置 ConfigMap保存的是不需要加密配置的信息 ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被…...
高分六号卫星助力农业监测_卫星介绍_论文分享_数据获取
卫星遥感已经成为农业发展的重要支持工具。《“数据要素X”三年行动计划(2024-2026年)》指出,在现代农业交通运输、应急管理等领域鼓励探索利用遥感数据。为什么高分六号会经常应用于农业检测呢?本文将介绍高分六号卫星的农业检测特性、在农业应用中的优势、具体农业…...
【Linux网络】TCP协议
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言1、TCP协议的特点2、确认应答机制3、超时重传机制4、TCP报头结构5、三次握手建立连接6、四次挥手断开连接总结 引言 TCP协议是传输层中非常重要的协议。本篇博客我们将从TCP头部信息、TCP状态转…...
Linux 基本指令讲解 上
linux 基本指令 clear 清屏 Alt Enter 全屏/退出全屏 pwd 显示当前用户所处路径 cd 改变目录 cd /root/mikecd … 返回上级目录cd - 返回最近所处的路径cd ~ 直接返回当前用户自己的家目 roor 中:/root普通用户中:/home/mike mkdir 创建一个文件夹(d) …...
深入了解指针(6)
文章目录 1.函数指针数组2.转移表3.回调函数 1.函数指针数组 存放函数指针的数组 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int add(int x, int y) {return x y; } int sub(int x, int y) {return x - y; }int main() {int (*p1)(int x, int y) add;int (…...
【Linux系列】known_hosts详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
MySQL4 多表查询 内连接
内连接 多表查询内连接 多表查询 数据准备 CREATE DATABASE db4; USE db4; -- 创建部门表 create table if not exists dept(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp(eid varchar(20) pr…...
力扣45:跳跃游戏2题解
题目链接: https://leetcode.cn/problems/jump-game-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 参考的代码随想录里面的题解: 题目 难度 中等,标的是中等难度,而且我之前做过这道题,但是我没写…...
产品经理-产品被同行抄袭如何处理(32)
在面试当中,如果被问到,产品被同行抄袭如何处理 竞争分析、战略决策。 1)对行业相关事件的关注度:如之前对腾讯抄袭事件的讨论,如果能结合“被抄袭”后的失败案例(例如联众)和反抄袭的成功案例(例如豆瓣&am…...
LDR6020在Type-C手机同时充电与USB2.0数据传输方案
随着科技的飞速发展,Type-C接口已成为智能手机等移动设备的主流充电和数据传输接口。为了满足用户对于高效充电与稳定数据传输的双重需求,乐得瑞科技推出的LDR6020芯片凭借其卓越的性能和丰富的功能,为Type-C手机提供了同时充电与USB2.0数据传…...
Python学习笔记(七)
""" 演示数据容器字典的定义 """# # 定义字典{key:value,key2:value2} 注意key不能是字典,value可以任意 # my_dict1 {"王力鸿": 99, "周杰轮": 88, "林俊节": 77}# #定义空字典 # my_dict2 {} # my…...
mysql中log
目录 MySQL 日志系统概述 日志类型 日志的作用和重要性 Mermaid图示 1. Undo Log 和 Redo Log 的协同工作图 2. Redo Log 确保持久性的流程图 Undo Log(回滚日志) 事务的原子性(Atomicity)保障 事务回滚机制 MVCC&#…...
iOS Object-C 创建类别(Category) 与使用
有时候使用系统给出类或者第三方的类,但是呢它们自带的属性和方法又太少,不够我们的业务使用,这时候就需要给“系统的类或者第三方类”创建一个类别(Category),把自己的想添加的属性和方法写进来. Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的 一:创建Ca…...
Rocky系统部署k8s1.28.2单节点集群(Containerd)+Kuboard
目录 Kubernetes介绍 Kubernetes具备的功能 Kubernetes集群角色 Master管理节点组件 Node工作节点组件 非必须的集群插件 Kubernetes集群类型 Kubernetes集群规划 集群前期环境准备 开启Bridge网桥过滤 关闭SWAP交换分区 安装Containerd软件包 K8s集群部署方式 集…...
Springboot整合Flowable入门-学习笔记
目录 1、定义流程(画图) 2、Springboot部署流程 3、Springboot删除所有流程 4、Springboot根据 流程部署ID 查询 流程定义ID 5、Springboot启动(发起)流程 6、Springboot查询任务 6.1全部任务 6.2我的任务(代办任务) 7、…...
C语言常见的题目
1、 从源码到可执行文件会经历怎样的过程? 预编译:去掉空格、注释,处理预定义的指令,生成处理后的源代码文件。 编译:翻译成汇编代码,生成汇编文件。 汇编:翻译成机器码,生成一个或…...
Android13适配记录
多语言支持,此功能在国内被阉割 配置后在设置内可以选择 <?xml version"1.0" encoding"utf-8"?> <locale-config xmlns:android"http://schemas.android.com/apk/res/android"><locale android:name"zh" …...
Android TV上OTT PWA应用开发的播放器选择:video.js vs exoplayer
跨平台 OTT PWA 应用开发,最方便的当然是选用 video.js 库。但是既然是安卓平台,exoplayer 看起来总是最稳妥的选择 介绍 Exoplayer 是 Android media3 的一个实现,以前是独立出来的,现在已经合并到 androidx.media3 中了。 Vid…...
专业的网站开发服务/知乎推广渠道
相信大家都玩过微信H5游戏,例如前几年的围住神经猫,也曾收到过好友分享来的H5游戏链接,因为好奇点进去一探究竟。现在,越来越多的商家开始将H5游戏运用的品牌营销上来,H5游戏营销也受到了重视,那么…...
wordpress更新5.2/新型网络搜索引擎
1.应聘公司不需要你会高大上的复杂工具,80%的公司最常用的数据分析工具。其实就是3剑客(Excel、SQL、PPT)。少部分公司才会额外要求会Python(或者R)、Tableau(或者Power-BI)。 2. 掌握SQL(操作数据库的语言…...
福州网站建设网络公司排名/网站销售怎么推广
Matlab提供了两种方法进行聚类分析。 一种是利用 clusterdata函数对样本数据进行一次聚类,其缺点为可供用户选择的面较窄,不能更改距离的计算方法; 另一种是分步聚类:(1)找到数据集合中变量两两之间的相似性…...
福建城乡建设部网站首页/seo推广培训费用
最近自己开始重新学习java基础了,做java开发不可避免要处理数据库,由于好久不写java了,对idea也有点陌生了。所以这里写篇用jdbc来连接mysql的文章至于mysql怎么装,请自行百度不多说先看代码import java.sql.Connection;import ja…...
joomla 转 wordpress/营销网站制作公司
VC操作Windows快捷方式(自己总结)二个操作:新建和解析主要用到的是COM组件。IShellLink和IPersistFile需要添加的头函数shobjidl.hIPersistFile主要用到两个成员函数:1、Save。保存内容到文件中去2、Load。读取Load的函数原型HRESULT Load(LPCOLSTR pszF…...
成都网站建设公司开发/seo代码优化步骤
相关函数:stat, open, chmod, chown, setuid, setgid头文件:#include <unistd.h>定义函数:int access(const char * pathname, int mode);函数说明:access()会检查是否可以读/写某一已存在的文件。 参数mode 有几种情况组…...