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

WindowsBatch FileCmdXcopy

Windows Problem Overview


My batch script xcopy is still asking F = file, D = directory confirmation even though I have added /F in the script, the log is showing as below. Please help on how to avoid 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)?

Windows Solutions


Solution 1 - Windows

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"

Solution 2 - Windows

Put a \ behind the target to suppress the question and specify it as a folder:

xcopy src dest\

Put a * behind the target to suppress the question and specify it as a file:

xcopy src dest*

Note: The second command is a hack that relies on wildcard matching (will match any item starting with "dest") so use it at your own risk!

Solution 3 - Windows

xcopy doesn't know the target is a directory. You clarify this by putting a backslash at the end:

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

Solution 4 - Windows

When copying a single file with XCOPY, there is no option to indicate if the destination is a filename or a directory (with the filename defaulting to that of the source file). In such cases XCOPY will prompt with a (locale specific) message like:

C:> xcopy foo.txt bar.txt

it prompts Does foo.txt specify a file name or directory name on the target (F = file, D = directory)?

Adding a wildcard (*) to the end of the destination will suppress this prompt and default to copying as a file:

C:> xcopy foo.txt bar.txt* 1 File(s) copied

This requires the source and target file extensions to be the same length, typically 3 characters.

for more information: https://ss64.com/nt/xcopy.html

Solution 5 - Windows

I use:

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

It works.

Solution 6 - Windows

Try:

echo F>xcopy_answer.tmp
xcopy xcopy /Q/Y "%source%" "%target%"<xcopy_answer.tmp

Solution 7 - Windows

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTestuserView Question on Stackoverflow
Solution 1 - WindowsaschipflView Answer on Stackoverflow
Solution 2 - WindowsPaulView Answer on Stackoverflow
Solution 3 - WindowsDominiqueView Answer on Stackoverflow
Solution 4 - WindowsMizan ShamuView Answer on Stackoverflow
Solution 5 - WindowsDarth ZmanView Answer on Stackoverflow
Solution 6 - WindowsnhatkhaiView Answer on Stackoverflow
Solution 7 - WindowsDivsView Answer on Stackoverflow