fro*_*tin 19 windows xcopy path batch-file filepath
嗨,我有一个小命令来批量复制文件,这将有所帮助,因为我每天多次执行此特定副本.使用xcopy命令时会发生此问题.一切都井然有序,但我收到此错误:"复制的路径0文件无效".这是代码:
C:\Windows\System32\xcopy /Y "C:\Users\Ryan\Desktop\mmars_pub\" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
Run Code Online (Sandbox Code Playgroud)
我正在使用xcopy可执行文件的完整路径,因为我无法正确配置路径环境变量.我想它不应该影响结果.我在某处读到了"防止基于MS-DOS的程序检测Windows"复选框,应该解决这个问题,但我似乎无法找到它.任何帮助赞赏.
MC *_* ND 62
原始答案
从源文件夹路径中删除结尾反斜杠
C:\Windows\System32\xcopy.exe /Y "C:\Users\Ryan\Desktop\mmars_pub" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
Run Code Online (Sandbox Code Playgroud)
编辑 2015/10/01
虽然原始问题使用了文字路径,并且指示的解决方案将解决问题,但还有另一种选择.对于文字路径以及路径在变量内并且可以(或不以)以反斜杠结尾的情况,足以确保结尾反斜杠(如果存在)与引号分开,包括结束点.
xcopy /y "x:\source\." "x:\target"
xcopy /y "%myVariable%." "x:\target"
Run Code Online (Sandbox Code Playgroud)
此结束点不会干扰文件/文件夹名称.如果有和结束反斜杠,附加点将简单地引用相同的文件夹.如果在Windows文件中没有结束反斜杠,并且文件夹无法用点结束其名称,则将被丢弃.
但是,如果xcopy将处理命令的输出,请记住此附加点将包含在显示的路径中.
注意:解决方案在线以上.如果对出现问题的原因/地点感兴趣,请继续阅读.
为什么xcopy "c:\source\" "d:\target\"失败但xcopy "c:\source" "d:\target\" 有效?
这两个命令似乎都有有效的路径引用,并且......是的!两者都是有效的路径引用,但有两个元素一起工作以使命令失败:
xcopy不是由cmd可执行文件处理的内部命令与xcopy外部命令一样,其参数不会在cmd解析器命令行逻辑之后处理.它们由Microsoft C启动代码处理.
该解析器遵循两套规则,即官方规则
参数由空格分隔,空格可以是空格或制表符.
由双引号括起的字符串被解释为单个参数,而不管其中包含的空格.带引号的字符串可以嵌入参数中.请注意,插入符号(
^)不会被识别为转义字符或分隔符.带有反斜杠的双引号将
\"被解释为文字双引号(").反斜杠按字面解释,除非它们紧跟在双引号之前.
如果偶数个反斜杠后跟双引号,则每个反斜杠(
\)对的argv数组中都会放置一个反斜杠(\\),双引号(")将被解释为字符串分隔符.如果奇数个反斜杠后跟一个双引号,那么每个反斜杠(
\)对的argv数组中都会放置一个反斜杠(\\),并且双引号会被剩余的反斜杠解释为转义序列,从而导致文字双引号(")放在argv中.
和未记录/非官方规则(如何解析命令行参数)
- 在双引号块之外,a
"启动双引号块.- 在双引号块内,
"后跟不同的字符(不是另一个")结束双引号块.- 在双引号块a内,
"紧接着另一个"(即"")导致单个"被添加到输出,并且双引号块继续.
此解析器将在"第一个"参数\"末尾找到的序列视为不结束/关闭参数的转义引用,它被视为部分或参数.而"第二个"参数的"起始"引用只是结束双引号块而不是结束参数,请记住参数是由空格分隔的.
所以虽然看起来命令行参数是
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\
Run Code Online (Sandbox Code Playgroud)
处理的实际参数xcopy是
v v .....argument delimiters
v......................v .....quoted block
xcopy "x:\souce\" "x:\target\"
^.....................^ .....argument data
arg #1
arg #1 = x:\source" x:\target"
Run Code Online (Sandbox Code Playgroud)
当删除结束反斜杠或包含附加点时,参数中的结束引号将不会被转义,它将关闭引用的块,并且参数之间的空格将被视为分隔符.