我的批处理脚本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\%
%target%\
一样将它移到一个位置(所以在关闭%
之后)...
标签: windows batch-file cmd xcopy
/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"
【讨论】:
F
和 directory 的 D
只是英文 Windows 上的正确字符。例如,在德语 Windows 上,D
用于文件(德语:Datei),V
用于目录(德语:Verzeichnis)。如果需要使用独立于操作系统语言的解决方案来使用 xcopy
复制无法使用 copy
复制的单个文件,请查看 this answer on BATCH file asks for file or folder 上的批处理代码。
copy
不会提示输入文件/目录。不过它的选择要少得多,所以在某些情况下可能不够用……
在目标后面放一个\
以抑制问题并将其指定为文件夹:
xcopy src dest
在目标后面放一个*
以抑制问题并将其指定为文件:
xcopy src dest*
注意:第二个命令是一个hack,它依赖于通配符匹配(将匹配任何以“dest”开头的项目),所以使用它需要您自担风险!
【讨论】:
xcopy
不知道目标是一个目录。您可以通过在末尾添加反斜杠来澄清这一点:
xcopy /S /I /Q /Y /F "%source%" "%target%\"
【讨论】:
source
是一个单个文件 而target
是一个文件夹,就我而言,将反斜杠添加到目标并使用@987654325 @switch 使文件/目录问题消失了,然后正确地假定了目录。
当使用 XCOPY 复制单个文件时,没有选项可以指示目标是文件名还是目录(文件名默认为源文件的文件名)。 在这种情况下,XCOPY 将提示一个(特定于语言环境的)消息,例如:
C:> xcopy foo.txt bar.txt
它提示 foo.txt 是否在目标上指定了文件名或目录名(F = 文件,D = 目录)?
在目标末尾添加通配符 (*) 将抑制此提示并默认复制为文件:
C:> xcopy foo.txt bar.txt* 1 个文件已复制
这要求源文件扩展名和目标文件扩展名长度相同,通常为 3 个字符。
【讨论】:
删除目标文件名将禁止显示该消息。这对我有用!
【讨论】:
我用:
xcopy /S /I /Q /Y /F "%source%" "%target%"
有效。
【讨论】:
试试:
echo F>xcopy_answer.tmp
xcopy xcopy /Q/Y "%source%" "%target%"<xcopy_answer.tmp
【讨论】:
联系客服