Команда XCopy для пакетного файла
-
13-09-2019 - |
Вопрос
У меня есть пакетный файл, который перебирает содержимое текстового файла и копирует определенный файл с помощью команды xcopy.
вот фрагмент.
for /f %%a in (FilesToCopy.txt) do (
xcopy ..\..\Common\%%a Common\%%a /i /d /c /v /s /y /f
xcopy Common\%%a ..\..\Common\%%a /i /d /C /v /s /y /f
)
%%a содержит такие значения, как Images\image1.jpg Images\image2.jpg
таким образом, когда выполняется xcopy, это будет выглядеть следующим образом
xcopy ..\..\Common\Images\image1.jpg Common\Images\image1.jpg /i /d /c /v /s /y
после выполнения он выдаст это сообщение
Does Common\Images\image1.png specify a file name
or directory name on the target
(F = file, D = directory)?
похоже, что команда /i не работает, или я чего-то здесь не хватает, чтобы подавить приведенное выше сообщение.
Решение
Что ж, вы не учли второй заявление, содержащееся в справке, касается /I
:
/I If destination does not exist and copying more than one file, assumes that destination must be a directory.
Вы копируете только один файл за раз, так что /I
неприменимо.
Вероятно, вы можете взломать решение этой проблемы с помощью конвейера F
ввод команды и подавление вывода:
echo F|xcopy ..\..\Common\%%a Common\%%a /i /d /c /v /s /y /f >nul
(Не будет работать в неанглоязычных версиях Windows;но, вероятно, это наименьшая из ваших проблем, учитывая, что пакет уже завершается с ошибкой для имен файлов с пробелами :-))
Вы могли бы попробовать создать единый длинный список имен файлов для копирования:
setlocal enabledelayedexpansion enableextensions
set LIST=
for /f %%a in (FilesToCopy.txt) do set LIST=!LIST! "..\..\Common\%%a"
xcopy %LIST% Common /i /d /c /v /s /y /f
Однако для этого требуется два прохода по исходному файлу.И это приводит к сбою, когда список имен файлов становится длиннее 8190 символов.
Другие советы
Пунктом назначения должен быть путь, тогда он не будет запрашивать:
xcopy ..\..\Common\Images\image1.jpg Common\Images\ /i /d /c /v /s /y
В вашем случае вы можете использовать извлечение пути с %~ p в пункте назначения, так как вы можете захотеть сохранить это:
xcopy ..\..\Common\%%a Common\%%~pa /i /d /c /v /s /y