【问题标题】:XCopy won't copy from path of the batch scriptXCopy 不会从批处理脚本的路径复制
【发布时间】:2023-02-22 12:35:00
【问题描述】:

我有一个运行批处理脚本的 intune 包,如下所示。

SET INST=%~dp0

xcopy %INST%\Folder1\* "C:\Program Files (x86)\Test\Folder2" /s /i

目标是将文件从 Folder1 复制到 Folder2。批处理脚本和文件夹 1 位于同一主文件夹中。没有文件被复制,所以我很困惑。

谢谢,

【问题讨论】:

  • 好的,在那种情况下,INST 的值是否正是您所期望的?此外,用户的正确文件系统权限应防止写入“C:\Program Files (x86)”目录。请参阅 How-to: Windows Environment Variables 了解您可能使用的正常位置,例如 APPDATALOCALAPPDATA
  • 您的第一行应读作 SET "INST=%~dp0",第二行应读作 %SystemRoot%\System32\xcopy.exe "%INST%Folder1" "%ProgramFiles(x86)%\Test\Folder2\" /S。您应该注意,此代码仅在您的最终用户具有目标目录的权限时才有效。
  • @Mofi,我刚刚尝试了您的实现并且成功了!谢谢你!

标签: batch-file cmd xcopy intune


【解决方案1】:

这两个命令行可以用单个命令行代替:

%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,因此使用完全限定文件名也使此命令行也无法安全运行,这可能会导致此命令行的执行与预期的不同.

源参数字符串中的%~dp0Folder1 之间没有反斜杠,因为%~dp0 总是扩展为包含以 结尾的批处理文件的目录的完整路径。因此,%~dp0Folder1 的结果参数字符串是 100% 有效的,在将目录参数字符串传递给文件系统之前,Windows file I/O functions 不得以任何方式对其进行修改。

可以附加到源参数字符串*,即使用"%~dp0Folder1*"作为第一个参数字符串XCOPY, 但默认复制指定源目录中的所有文件,并使用选项 /S 复制非空目录中的所有文件。

目标参数字符串以反斜杠结尾。这使得 100% 清楚XCOPY目标是一个目录。末尾的反斜杠使得没有必要使用选项/IXCOPY始终创建到目标目录的整个目录树。目标绝对是一个目标参数字符串以反斜杠结尾的目录。

的用法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:

【讨论】:

    【解决方案2】:

    谢谢,这对我有用。

    【讨论】:

    • 请不要添加谢谢作为答案。它们实际上并没有提供问题的答案,并且可能被未来的访问者视为噪音。一旦你earn足够reputation,你将获得你喜欢的upvote answers的特权。这样问题的未来访问者将看到对该答案的更高投票计数,并且回答者也将获得声誉点数奖励。参见Why is voting important
    猜你喜欢
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多