【问题标题】:XCOPY still asking (F = file, D = directory) confirmationXCOPY 仍在询问(F = 文件,D = 目录)确认
【发布时间】:2016-02-18 13:49:01
【问题描述】:
我的批处理脚本xcopy 仍然要求F = file, D = directory 确认,即使我在脚本中添加了/F ,日志显示如下。
请帮助了解如何避免要求确认。
脚本:
net use p: /delete
net use p: "\\200clan\F_Drive" /USER:adm /PERSISTENT:NO-1111
set source=%1
set target=p:/%2
echo %source% %target%
xcopy /S /I /Q /Y /F "%source%" "%target%"
日志:
C:\test\foldera>xcopy /S /I /Q /Y /F "C:/test/folder1/folder2/logs/154/compareReport_177.html" "p:/Services/WSDLCompare/177_20151116/compareReport_177.html"
Does P:\Services\WSDLCompare\177_20151116\UIReport_177.html specify a file name
or directory name on the target
(F = file, D = directory)?
【问题讨论】:
-
如果您不想费心查看xcopy 的所有详细信息和选项,请在目标路径的末尾添加back-slash %target\%
-
@mchar,但是你必须像%target%\ 一样将它移到一个位置(所以在关闭% 之后)...
标签:
windows
batch-file
cmd
xcopy
【解决方案1】:
/I 开关(不是您在问题中提到的/F )阻止xcopy 只有在给出多个源文件时才询问目标是文件还是目录,所以如果源是目录,或者如果使用了通配符 ? 或 * 。如果目的地已经存在,则不会出现此类提示。
有以下几种情况(取决于%source% 和%target% 提供的值):
-
单个源文件,目标是一个文件:
/I 开关没用,所以你需要将F 输入xcopy 命令行:
echo F|xcopy /S /Q /Y /F "%source%" "%target%"
如果给定/Y 开关(强制覆盖),你也可以提前创建目标文件(空文件):
>> "%target%" rem/
xcopy /S /Q /Y /F "%source%" "%target%"
-
单个源文件,目标是目录:
/I 开关也没有用;您可以将D 输入xcopy 命令行:
echo D|xcopy /S /Q /Y /F "%source%" "%target%"
或者您可以简单地将\ 附加到目的地:
xcopy /S /Q /Y /F "%source%" "%target%\"
虽然这会在%target% 指定驱动器的当前目录时引起麻烦,例如D: ,因为D: 表示该驱动器的当前目录,而D:\ 表示它的根目录;
或者你提前创建目标目录:
2> nul mkdir "%target%"
xcopy /S /Q /Y /F "%source%" "%target%"
2> nul 部分在目录已存在的情况下抑制错误消息;
-
多个源文件,目标是一个文件:
这通常是一种毫无意义的情况,因为您告诉xcopy 将每个源文件复制到同一个目标文件,从而试图覆盖它;
-
多个源文件,目标是一个目录:
/I 开关在这里很有意义:
xcopy /S /I /Q /Y /F "%source%" "%target%"
管道选项也可以在这里使用:
echo D|xcopy /S /Q /Y /F "%source%" "%target%"
将\ 附加到目的地也是如此(关于上述限制):
xcopy /S /Q /Y /F "%source%" "%target%\"
或者你提前创建目标目录:
2> nul mkdir "%target%"
xcopy /S /Q /Y /F "%source%" "%target%"
结论
最灵活、最安全的解决方案是将所需的选择(F 或 D )通过管道传输到 xcopy 命令行。 (请注意,查询取决于区域设置。)
补充
我想在这里提一下您的代码片段中的一些小问题:
- 您通常应该使用
\ 作为路径分隔符,因为这是用于此目的的 Windows 标准字符(尽管 / 在大多数情况下也可以使用); - 有
-1111 附加到您的第二个net use 命令行;如果这构成资源的密码,则应将其移至 /USER 选项之前;否则只需删除它; - 你的
set 命令行引入了一些特殊字符的问题(如& 、^ 、( 、) );为避免这种情况,请注明set "source=%~1" 和set "target=p:/%~2" ; ~ 从参数中删除潜在的 "" 周围(如果它们包含 SPACE、, 、; 、= ,则为必需);
这是对上述所有内容进行了修改的代码:
net use P: /DELETE
rem supposing `-1111` constitutes the password for the resource:
net use P: "\\200clan\F_Drive" -1111 /USER:adm /PERSISTENT:NO
set "source=%~1"
set "target=P:\%~2"
echo "%source%" "%target%"
rem supposing the destination is a directory:
echo D|xcopy /S /I /Q /Y /F "%source%" "%target%"
rem actually you do not need any interim variables:
REM echo D|xcopy /S /I /Q /Y /F "%~1" "P:\%~2"
【讨论】:
-
-
将斜杠添加到目标目录的末尾为我修复了它。它不再询问路径是文件还是目录。谢谢!
-
我的解决方案很简单:将 XCOPY 替换为 COPY 命令,ejem: COPY "%source%" "%target%" /Y
-
当然,@Jhollman, copy 不会提示输入文件/目录。不过它的选择要少得多,所以在某些情况下可能不够用……
-
很好的答案。但请注意,存在本地化问题 - 它适用于英语 Windows 版本,但例如在德语 Windows 上,它将是“d = file (datei), v = directory (verzeichnis)”,所以你会写 @987654382 @ 代替。
【解决方案2】:
在目标后面放一个\ 以抑制问题并将其指定为文件夹:
xcopy src dest
在目标后面放一个* 以抑制问题并将其指定为文件:
xcopy src dest*
注意:第二个命令是一个hack,它依赖于通配符匹配(将匹配任何以“dest”开头的项目),所以使用它需要您自担风险!
【讨论】:
-
我一直认为这是一个建议,在测试后我不得不说,它不像宣传的那样工作。通配符 (*) 仍然是通配符,因此它将尝试匹配以 file2 开头的任何内容(使用上面的相同示例)。我建议使用管道方法,这有点愚蠢,但它确实有效。我希望有一个开关只是说“它始终是一个文件”或“它始终是一个目录”。
【解决方案3】:
xcopy 不知道目标是一个目录。您可以通过在末尾添加反斜杠来澄清这一点:
xcopy /S /I /Q /Y /F "%source%" "%target%\"
【讨论】:
-
这对我的情况有所帮助,尽管它在技术上不是原始帖子的正确答案。示例目标变量包括完整路径和文件名,因此在末尾添加反斜杠只会混淆原始海报的内容。如果source 是一个单个文件 而target 是一个文件夹,就我而言,将反斜杠添加到目标并使用@987654325 @switch 使文件/目录问题消失了,然后正确地假定了目录。
【解决方案4】:
当使用 XCOPY 复制单个文件时,没有选项可以指示目标是文件名还是目录(文件名默认为源文件的文件名)。
在这种情况下,XCOPY 将提示一个(特定于语言环境的)消息,例如:
C:> xcopy foo.txt bar.txt
它提示
foo.txt 是否在目标上指定了文件名或目录名(F = 文件,D = 目录)?
在目标末尾添加通配符 (*) 将抑制此提示并默认复制为文件:
C:> xcopy foo.txt bar.txt*
1 个文件已复制
这要求源文件扩展名和目标文件扩展名长度相同,通常为 3 个字符。
更多信息:https:///nt/xcopy.html
【解决方案6】:
我用:
xcopy /S /I /Q /Y /F "%source%" "%target%"
有效。
【讨论】:
-
帮助(xcopy /?)显示/Q和/F是相反的: /Q:复制时不显示文件名; /F:复制时显示完整的源文件名和目标文件名。
【解决方案7】:
试试:
echo F>xcopy_answer.tmp
xcopy xcopy /Q/Y "%source%" "%target%"<xcopy_answer.tmp
|