XCOPY 仍在询问(F = 文件,D = 目录)确认
Posted
技术标签:
【中文标题】XCOPY 仍在询问(F = 文件,D = 目录)确认【英文标题】:XCOPY still asking (F = file, D = directory) confirmation 【发布时间】: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%\
一样将它移到一个位置(所以在关闭%
之后)...
【参考方案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"
【讨论】:
很好的答案。我只想补充一点,file 的F
和 directory 的 D
只是英文 Windows 上的正确字符。例如,在德语 Windows 上,D
用于文件(德语:Datei),V
用于目录(德语:Verzeichnis)。如果需要使用独立于操作系统语言的解决方案来使用 xcopy
复制无法使用 copy
复制的单个文件,请查看 this answer on BATCH file asks for file or folder 上的批处理代码。
将斜杠添加到目标目录的末尾为我修复了它。它不再询问路径是文件还是目录。谢谢!
我的解决方案很简单:将 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://ss64.com/nt/xcopy.html
【讨论】:
【参考方案5】:删除目标文件名将禁止显示该消息。这对我有用!
【讨论】:
【参考方案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
【讨论】:
以上是关于XCOPY 仍在询问(F = 文件,D = 目录)确认的主要内容,如果未能解决你的问题,请参考以下文章