XCOPY still asking (F = file, D = directory) confirmation

匿名 (未验证) 提交于 2019-12-03 03:06:01

问题:

My batch script xcopy is still asking F = file, D = directory confirmation even though I added /F in the script, log it is showing as below. Please help on the is how to avoid to asking confirmation.

Script:

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

Log:

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)?  

回答1:

The /I switch (not /F as you mentioned in your question) prevents xcopy from asking whether the destination is a file or a directory only if multiple source files are given, so if the source is a directory, or if wildcards ? or * are used. If the destination already exists, such prompt does never appear.

There are the following scenarios (depending on the provided values of %source% and %target%):

  • a single source file, the destination is a file:

    the /I switch is useless, so you need to pipe F into the xcopy command line:

    echo F|xcopy /S /Q /Y /F "%source%" "%target%" 

    provided that the /Y switch is given (to force overwriting), you could also create the target file in advance (empty file):

    >> "%target%" rem/ xcopy /S /Q /Y /F "%source%" "%target%" 
  • a single source file, the destination is a directory:

    the /I switch is useless too; you can pipe D into the xcopy command line:

    echo D|xcopy /S /Q /Y /F "%source%" "%target%" 

    or you can simply append a \ to the destination:

    xcopy /S /Q /Y /F "%source%" "%target%\" 

    although this causes trouble when %target% specifies the current directory of a drive like D: for instance, because D: means the current directory of this drive whereas D:\ means the root directory of it;

    or you create the destination directory in advance:

    2> nul mkdir "%target%" xcopy /S /Q /Y /F "%source%" "%target%" 

    the 2> nul portion suppresses the error message in case the directory already exists;

  • multiple source files, the destination is a file:

    this is usually a senseless situation, because you tell xcopy to copy each source file to the same destination file, thus attempting to overwrite it;

  • multiple source files, the destination is a directory:

    the /I switch makes sense here:

    xcopy /S /I /Q /Y /F "%source%" "%target%" 

    the pipe option also works here:

    echo D|xcopy /S /Q /Y /F "%source%" "%target%" 

    so does appending a \ to the destination (regarding the limitation as mentioned above):

    xcopy /S /Q /Y /F "%source%" "%target%\" 

    or you create the destination directory in advance:

    2> nul mkdir "%target%" xcopy /S /Q /Y /F "%source%" "%target%" 

Conclusion

The most flexible and secure solution is to pipe the desired selection (F or D) into the xcopy command line. (Note that the query is locale-dependent.)


Supplement

There are some minor issues in your code fragment I want to mention here:

  • you should generally use the \ as a path separator as this is the Windows standard character for that purpose (although / works too in most cases);
  • there is -1111 appended to your second net use command line; if this constitutes the password for the resource, it should be moved before the /USER option; otherwise just remove it;
  • your set command lines introduce problems with some special characters (like &, ^, (, )); to avoid such, state set "source=%~1" and set "target=p:/%~2"; the ~ removes potential surrounding "" from the arguments (which are required if they contain SPACE, ,, ;, =);

Here is the code with the all of the above things reworked:

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" 


回答2:

xcopy does not know that the target is a directory. You make this clear by putting a backslash at end:

xcopy /S /I /Q /Y /F "%source%" "%target%\" 


回答3:

Removing the destination filename will suppress the message. This works for me!



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!