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

Tes*_*ser 28 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%"
Run Code Online (Sandbox Code Playgroud)

日志:

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)? 
Run Code Online (Sandbox Code Playgroud)

asc*_*pfl 41

/I开关(不/F,你在你的问题中提到)防止xcopy从询问目的地是否是文件或者只在多个源文件中给出的目录,所以如果源是一个目录,或者如果通配符?*使用.如果目标已存在,则不会出现此类提示.

有以下方案(取决于提供的%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"
Run Code Online (Sandbox Code Playgroud)

  • 非常好的答案.我只想补充说__file__的`F`和__directory__的`D`只是英文Windows上的正确字符.例如,德语Windows`D`用于文件(德语:Datei),"V"用于目录(德语:Verzeichnis).如果需要一个独立于操作系统语言的解决方案来复制一个不能用`copy`复制的`xcopy`的文件,请查看[BATCH文件上的这个答案要求文件或文件夹]的批处理代码(http:// stackoverflow.com/a/35829012/3074564). (5认同)

小智 22

在目标文件后面放一个*.这会抑制问题并默认为File.

Xcopy file1 file2*

Xcopy file1 file2\ 
Run Code Online (Sandbox Code Playgroud)

默认为文件夹.

  • 我一直认为这是一个建议,在测试后我不得不说,它并不像广告中那样有效。通配符 (*) 仍然是通配符,因此它将尝试匹配以 file2 开头的任何内容(使用上面的相同示例)。我建议使用管道方法,这有点愚蠢,但它有效。我希望有一个开关只显示“它始终是一个文件”或“它始终是一个目录”。 (5认同)

Dom*_*que 12

xcopy不知道目标是一个目录.你通过在结尾处加上反斜杠来阐明这一点:

xcopy /S /I /Q /Y /F "%source%" "%target%\"
Run Code Online (Sandbox Code Playgroud)


小智 9

使用 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