这两个命令行可以用单个命令行代替:
%SystemRoot%System32opy.exe "%~dp0Folder1" "%ProgramFiles(86)%TestFolder2" /S
带有此命令行的批处理文件需要以管理员身份运行因为 %ProgramFiles(86)% 引用的目录通常对标准用户是写保护的。
在命令提示符窗口中运行 cmd /? 时的帮助输出在最后一个帮助页面上解释了包含空格或这些字符之一的文件名(或任何其他参数字符串,如密码)&()[]{}^=;!'+,`~(或按字面解释 @987654329 @ 作为密码)必须包含在 " 中才能被解释为一如果在批处理文件中解析命令行时启用了延迟扩展,则除% 和! 之外的所有字符都按字面解释的参数字符串。如果不能保证 " 与 %SystemRoot%System32opy.exe 一样不需要,建议始终将文件/文件夹参数字符串括在双引号中。
Windows commandXCOPY用完全限定的文件名指定。这提高了效率,因为 Windows 命令处理器不需要在文件系统中搜索文件名为 xcopy 的可执行文件/脚本,在当前目录和列出的目录中,在本地环境变量 PATH 的值中用文件分隔本地环境变量值中列出的扩展名PATHEXT。由于当前目录中没有xcopy.cmd或损坏的PATH不再包含%SystemRoot%System32,因此使用完全限定文件名也使此命令行也无法安全运行,这可能会导致此命令行的执行与预期的不同.
源参数字符串中的%~dp0 和Folder1 之间没有反斜杠,因为%~dp0 总是扩展为包含以 结尾的批处理文件的目录的完整路径。因此,%~dp0Folder1 的结果参数字符串是 100% 有效的,在将目录参数字符串传递给文件系统之前,Windows file I/O functions 不得以任何方式对其进行修改。
可以附加到源参数字符串*,即使用"%~dp0Folder1*"作为第一个参数字符串XCOPY, 但默认复制指定源目录中的所有文件,并使用选项 /S 复制非空目录中的所有文件。
目标参数字符串以反斜杠结尾。这使得 100% 清楚XCOPY目标是一个目录。末尾的反斜杠使得没有必要使用选项/I。XCOPY始终创建到目标目录的整个目录树。目标绝对是一个目标参数字符串以反斜杠结尾的目录。
的用法XCOPY自 Windows Vista 和 Windows Server 2003 以来已弃用复制默认安装在Windows系统目录下。 ROBOCOPY 是一个更健壮和更强大的文件/目录复制/移动程序。在命令提示符窗口中运行 robocopy /? 以获取其使用帮助的输出或阅读 Microsoft 文档以获取 robocopy。
可以完成相同的目录复制任务复制和:
%SystemRoot%System32
obocopy.exe "%~dp0Folder1" "%ProgramFiles(86)%TestFolder2" /S /NDL /NFL /NJH /NJS /R:2 /W:3 >nul
复制如果有必要,还会创建整个目标目录树。
重要的是要提到 robocopy.exe 使用特殊的参数字符串解析,如 reg.exe。 剩下一个 或 " 被解释为后面的反斜杠或双引号字符的转义字符。出于这个原因,没有参数字符串复制包含在 " 中的应该以单个反斜杠结尾,因为这将被解释为双引号的转义,因此直到下一个 " 的所有内容都被解释为一个参数字符串,尽管目录路径根本不能包含字符 " .
有效的复制命令行与源和目标有关:
%SystemRoot%System32
obocopy.exe "%~dp0Folder1" "%ProgramFiles(86)%TestFolder2" /S
%SystemRoot%System32
obocopy.exe "%~dp0Folder1\" "%ProgramFiles(86)%TestFolder2\" /S
无效的复制命令行与源和目标有关:
%SystemRoot%System32
obocopy.exe %~dp0Folder1 %ProgramFiles(86)%TestFolder2 /S
%SystemRoot%System32
obocopy.exe "%~dp0Folder1" "%ProgramFiles(86)%TestFolder2" /S
第一行无效,因为 %~dp0 可以扩展为包含空格的字符串或其中一个字符 &()[]{}^=;!'+,`~ 和 %ProgramFiles(86)% 默认扩展为包含空格和两个圆括号的字符串,因此源路径和目标路径必须是用双引号括起来。
如果驱动器的根目录是目录路径必须以反斜杠结尾的源目录或目标目录,则最好不要将根目录路径括在双引号中,如 C: 或 D:。