“复制了无效的路径 0 文件”使用 xcopy 命令时出错
Posted
技术标签:
【中文标题】“复制了无效的路径 0 文件”使用 xcopy 命令时出错【英文标题】:"invalid path 0 files copied" Error while using xcopy command 【发布时间】:2014-09-15 04:31:49 【问题描述】:您好,我有这个小命令可以批量复制文件,这会有所帮助,因为我每天会多次执行此特定复制。使用 xcopy 命令时会出现此问题。一切正常,但我收到此错误:“复制了无效的路径 0 文件”。代码如下:
C:\Windows\System32\xcopy /Y "C:\Users\Ryan\Desktop\mmars_pub\" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
我正在使用 xcopy 可执行文件的完整路径,因为我在配置路径环境变量以使其正常运行时遇到问题。我想它不应该影响结果。我在某处读到了有关“防止基于 MS-DOS 的程序检测 Windows”复选框的信息,该复选框应该可以解决该问题,但我似乎找不到。任何帮助表示赞赏。
【问题讨论】:
您使用的xcopy
命令不是基于MS-DOS 的程序。这是一个 Windows 控制台程序。
%path%
变量默认设置为使用正确的文件夹。如果您重新使用了 path
变量,请选择不同的变量名称。这仅与您必须将完整路径设置为 xcopy
命令的方式有关。
【参考方案1】:
原答案
从源文件夹路径中删除结尾的反斜杠
C:\Windows\System32\xcopy.exe /Y "C:\Users\Ryan\Desktop\mmars_pub" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
已编辑 2015/10/01
虽然原始问题使用文字路径,并且指示的解决方案将解决问题,但还有另一种选择。对于文字路径以及路径在变量内部并且可以(或不)以反斜杠结尾的情况,确保结尾反斜杠(如果存在)与引号分开就足够了,包括结尾点。
xcopy /y "x:\source\." "x:\target"
xcopy /y "%myVariable%." "x:\target"
这个结束点不会影响文件/文件夹的名称。如果有和结尾的反斜杠,附加的点将简单地引用同一个文件夹。如果没有结束反斜杠,如 windows 文件和文件夹不能以点结束其名称,它将被丢弃。
但是如果xcopy
命令的输出将被处理,请记住这个额外的点将包含在显示的路径中。
注意:解决方案高于线。如果对存在问题的原因/位置感兴趣,请继续阅读。
为什么xcopy "c:\source\" "d:\target\"
失败但xcopy "c:\source" "d:\target\"
有效?
这两个命令似乎都有有效的路径引用,而且……是的!两者都是有效的路径引用,但有两个元素共同作用导致命令失败:
文件夹引用被引用(注意:它应该被引用,引用路径是一个好习惯,因为你永远不知道它们何时会包含空格或特殊字符)xcopy
不是cmd
处理的内部命令,而是一个可执行文件
由于xcopy
是一个外部命令,它的参数不会按照cmd
解析器命令行逻辑进行处理。它们由Microsoft C startup code 处理。
这个解析器遵循两套规则,官方规则
参数由空格分隔,空格或制表符。
用双引号括起来的字符串被解释为单个参数,无论其中包含什么空格。一个引用 字符串可以嵌入到参数中。请注意,插入符号 (
^
) 不是 识别为转义字符或分隔符。前面有反斜杠
\"
的双引号被解释为文字双引号 ("
)。反斜杠按字面意思解释,除非它们紧跟在双引号之前。
如果偶数个反斜杠后跟双引号,则每个反斜杠 (
\
) 将放置在 argv 数组中 一对反斜杠 (\\
),双引号 ("
) 是 解释为字符串分隔符。如果奇数个反斜杠后跟双引号,则每个反斜杠 (
\
) 将放置在 argv 数组中 一对反斜杠 (\\
) 和双引号被解释 作为剩余反斜杠的转义序列,导致文字 双引号 ("
) 放在 argv 中。
和无证/非官方规则 (How Command Line Parameters Are Parsed)
在双引号块之外,"
开始一个双引号块。 在双引号块内,"
后跟一个不同的字符(不是另一个"
)结束双引号块。 在双引号块内,"
紧跟另一个"
(即""
)会导致将单个"
添加到输出中,并且 双引号块继续。
此解析器将在 "first" 参数末尾找到的序列\"
视为不结束/关闭参数的转义引号,它被视为部分或参数。而 "second" 参数的 "starting" 引号只是结束了双引号块但没有结束参数,请记住参数由空格分隔。 p>
所以虽然 似乎命令行参数是
v v v......argument delimiters
v.........v v..........v ......quoted blocks
xcopy "x:\souce\" "x:\target\"
^.......^ ^........^ ......argument data
arg #1 arg #2
arg #1 = x:\source\
arg #2 = x:\target\
xcopy
处理的实际参数是
v v .....argument delimiters
v......................v .....quoted block
xcopy "x:\souce\" "x:\target\"
^.....................^ .....argument data
arg #1
arg #1 = x:\source" x:\target"
当结束反斜杠被删除或包含额外的点时,参数中的右引号不会被转义,它会关闭带引号的块,参数之间的空格将被视为分隔符。
【讨论】:
arg #1 = <x:\souce" >
(去掉<>
)双引号块在目标的first双引号结束。
@MayraDelgado,不,分隔符是空格。目标中的第一个引号只是关闭了引用的区域,但在它之后没有空格,所以参数继续。
如果您在构建事件中使用像 $(TargetDir)
这样的宏,那么不幸的是它们在目录中包含反斜杠,因此请注意这一点。
解决了!谢谢!它在 Visual Studio 上本地运行良好,但在使用 msbuild 时会在 Jenkins 中失败。以上是关于“复制了无效的路径 0 文件”使用 xcopy 命令时出错的主要内容,如果未能解决你的问题,请参考以下文章