我的批处理脚本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)?
答案 0 :(得分:31)
你问题中提到的/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"
答案 1 :(得分:11)
在目标文件后面放一个*。这会取消该问题并默认为文件。
Xcopy file1 file2*
Xcopy file1 file2\
默认为文件夹。
答案 2 :(得分:9)
xcopy
不知道目标是目录。你通过在结尾加一个反斜杠来澄清这一点:
xcopy /S /I /Q /Y /F "%source%" "%target%\"
答案 3 :(得分:1)
使用XCOPY复制单个文件时,没有选项表明目标是文件名还是目录(文件名默认为源文件的文件名)。 在这种情况下,XCOPY将提示一个(特定于区域设置的)消息,例如:
C:> xcopy foo.txt bar.txt
它提示 foo.txt是否在目标上指定文件名或目录名(F =文件,D =目录)?
在目标末尾添加通配符(*)将取消显示此提示,默认情况下将其复制为文件:
C:> xcopy foo.txt bar.txt * 已复制1个文件
这要求源文件扩展名和目标文件扩展名的长度相同,通常为3个字符。
答案 4 :(得分:0)
删除目标文件名将禁止显示该消息。这对我有用!
答案 5 :(得分:0)
我用:
xcopy /S /I /Q /Y /F "%source%" "%target%"
有效。
答案 6 :(得分:0)
尝试:
echo F>xcopy_answer.tmp
xcopy xcopy /Q/Y "%source%" "%target%"<xcopy_answer.tmp