分享

XCOPY 仍在询问(F = 文件,D = 目录)确认答案

 _src_ 2023-03-18 发布于四川
【问题标题】: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%"
    

结论

最灵活、最安全的解决方案是将所需的选择(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"

【讨论】:

  • 很好的答案。我只想补充一点,fileFdirectoryD 只是英文 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:///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

【讨论】:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多