XCOPY仍然要求(F =文件,D =目录)确认

时间:2015-11-17 08:57:12

标签: batch-file

我的批处理脚本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)? 

7 个答案:

答案 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%"
    

结论

最灵活,最安全的解决方案是将所需的选择(FD)传输到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个字符。

有关更多信息:https://ss64.com/nt/xcopy.html

答案 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