嗨,我有这个小命令批量复制文件,这将有助于,因为我一天做多个特定的副本。 使用xcopy命令时发生此问题。 一切都是为了,但我收到此错误:“无效的path0文件复制”。 这里是代码:
C:\Windows\System32\xcopy /Y "C:\Users\Ryan\Desktop\mmars_pub\" "C:\Users\Ryan\Desktop\Dropbox\MMARS\mmars_pub\"
我正在使用xcopy可执行文件的完整path,因为我在configurationpath环境variables时无法正常工作。 我会想象它应该不会影响结果。 我读了一些关于“防止基于MS-DOS的程序检测Windows”checkbox,应该解决这个问题,但我似乎无法find。 任何帮助赞赏。
原始答案
从源文件夹路径中删除结尾的反斜杠
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启动代码处理 。
这个解析器遵循两套规则,即官方规则
参数是由空格分隔的,空格是一个空格或一个制表符。
由双引号包围的字符串被解释为单个参数,而不管其中包含的空白。 带引号的字符串可以嵌入到参数中。 请注意,脱字符(
^
)不被识别为转义字符或分隔符。双引号前加一个反斜杠
\"
,被解释为文字双引号("
)。反斜杠从字面上解释,除非它们立即在双引号之前。
如果偶数个反斜杠后面跟着一个双引号,则对于每对反斜杠(
\\
),将一个反斜杠(\
)放在argv数组中,双引号("
)被解释为字符串分隔符。如果反斜杠的奇数后跟一个双引号,则对于每对反斜杠(
\\
),将一个反斜杠(\
)放在argv数组中,双引号将被解释为转义序列,其余的反斜杠,导致一个文字双引号("
)被放置在argv。
和无证/非官方规则( 如何解析命令行参数 )
- 在双引号块之外
"
开始一个双引号块。- 在一个双引号块中,
"
后跟一个不同的字符(不是另一个"
)结束双引号块。- 在一个双引号块中,
"
紧随其后"
(即""
)导致单个"
被添加到输出,并且双引号块继续。
这个解析器将在第一个参数结尾处找到的序列看作是一个不结束/关闭参数的转义引用,它被看作是参数的一部分,而第二个参数的“起始 ”参数只是结束双引号块,但不结束参数,请记住,参数是由白色空间分隔。
所以虽然看起来命令行参数是
vv 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
处理的实际参数是
vv .....argument delimiters v......................v .....quoted block xcopy "x:\souce\" "x:\target\" ^.....................^ .....argument data arg #1 arg #1 = x:\source" x:\target"
当结束的反斜杠被删除或包含额外的点时,参数中的结尾引号将不会被转义,它将关闭引用的块,参数之间的空格将被视为分隔符。