XCOPY по-прежнему запрашивает (F = файл, D = каталог) подтверждение

Мой пакетный скрипт xcopy все еще спрашивает F = file, D = directory подтверждение 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)? 

Ответ 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%"
    

Вывод

Наиболее гибким и безопасным решением является передача нужного выбора (F или D) в командную строку xcopy. (Обратите внимание, что запрос зависит от языка.)


дополнение

В фрагменте кода есть некоторые незначительные проблемы, которые я хочу упомянуть здесь:

  • вы обычно должны использовать \ как разделитель путей, поскольку для этой цели это стандартный символ Windows (хотя / в большинстве случаев работает);
  • есть -1111 добавленный к вашей второй net use командной строке; если это составляет пароль для ресурса, его следует перенести до опции /USER; иначе просто удалите его;
  • ваши set командные строки 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"

Ответ 2

xcopy не знает, что целью является каталог. Вы проясните это, поставив в конце обратную косую черту:

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

Ответ 3

Поместите * за целевой файл. Это подавляет вопрос и по умолчанию используется файл.

Xcopy file1 file2*

Xcopy file1 file2\ 

по умолчанию - папка.

Ответ 4

Удаление имени файла назначения приведет к подавлению сообщения. Это работает для меня!

Ответ 5

Я использую:

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

Оно работает.

Ответ 6

Пытаться:

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

Ответ 7

При копировании одного файла с помощью 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