Как удалить файлы из списка?

У меня есть файловая система, которая использует алгоритм хеширования для организации файлов. В прошлом я использовал xcopy для копирования файлов в другое место, передавая файл со списком всех файлов и повторяя его. Скрипт выглядит примерно так:

for /f "delims=, tokens=1,2,3" %i in (D:\foo.csv) 
do echo F | xcopy /i /d "Z:\%i\%j\%k" "Y:\%i\%j\%k" >> "D:\xcopy\Log.txt"

Однако теперь я столкнулся с ситуацией, когда в дополнение к копированию файлов, предоставленных в файле foo.csv, я хочу, чтобы они также были удалены. Я просмотрел документацию по xcopy и ничего не нашел. Могу ли я как-то это сделать, даже если мне придется запустить другой скрипт, чтобы просмотреть тот же список файлов и удалить их после использования xcopy?

Спасибо!


person Saggio    schedule 11.10.2011    source источник


Ответы (3)


Вы можете использовать круглые скобки, чтобы указать несколько команд, которые должны быть выполнены операндом for:

for /f "delims=, tokens=1,2,3" %%i in (D:\foo.csv) do (
    echo F | xcopy /i /d "Z:\%%i\%%j\%%k" "Y:\%%i\%%j\%%k" >> "D:\xcopy\Log.txt"
    del /F "Z:\%%i\%%j\%%k"
)
person yms    schedule 24.10.2011
comment
Всякий раз, когда я пытаюсь запустить это, он просто продолжает выводить More? снова и снова независимо от того, что я печатаю. Я делаю что-то неправильно? - person Saggio; 27.10.2011
comment
@user564636 user564636 Мне нужно увидеть фактический входной файл, который вы используете для дальнейшей диагностики. Также примите во внимание, что вам нужно использовать %%i вместо %i, если вы используете это внутри скрипта .bat. - person yms; 27.10.2011
comment
Неважно, я просто пропустил цитату. Итак, теперь, когда я запускаю его таким образом, он дает мне недопустимое количество ошибок параметров, но если я использую конвейер (например, между командами echo F и xcopy), он фактически удаляет исходные файлы до того, как они закончат копирование. Любые идеи? (EDIT): я запускаю его прямо в командной строке, я не использую пакетный файл - person Saggio; 28.10.2011
comment
@user564636 user564636 Чтобы скобки работали, вам нужно поместить их в скрипт, так как вы должны помещать каждую команду в новую строку. - person yms; 28.10.2011
comment
Как только я поместил его в файл .bat (и мне пришлось переместить do (до той же строки, что и команда for, потому что при запуске она выдавала мне неправильные синтаксические ошибки), он заработал как шарм. Спасибо!! - person Saggio; 28.10.2011

Я не знаком с Windows (я с удовольствием использую Gnu/Linux с 1993 года), но, возможно, вы могли бы добавить какую-нибудь команду с переменными типа del %n где-нибудь (или заменить xcopy своим собственным файлом .bat, делая то, что вы хотите)

person Basile Starynkevitch    schedule 24.10.2011

Судя по всему, вы можете использовать команду move вместо xcopy, поскольку вы не используете расширенные функции xcopy. Предполагается, что «/ d» используется только для копирования файлов, если они новее, не уверен, насколько это полезно для ваших целей, поскольку вы хотите их удалить. В противном случае у перемещения не так много вариантов, о которых можно было бы говорить.

Другой возможный и несколько более сложный метод – robocopy.
robocopy /MOVE /XO "Z:\%i\%j\%k" "Y:\%i\%j\%k"
/MOVE удалит и папки, и файлы после копирования, а флаг /XO исключает копирование старых файлов. robocopy в основном доступен в более новых операционных системах (т. е. не в XP). Вы можете проверить вышеупомянутую ссылку для более подробной информации.

Надеюсь это поможет. Хотя простое использование del, как упоминалось ранее, также должно работать нормально.

person CodingAway    schedule 27.10.2011
comment
Это работает для списков файлов? Переменная «%k» — это имя файла, а не каталога. У меня сложилось впечатление, что robocopy может копировать/перемещать только целые каталоги и их содержимое, а не отдельные файлы в них. (EDIT): Неважно, мне не хватило кавычки - person Saggio; 27.10.2011
comment
Не обращайте внимания на редактирование, которое должно было быть для моего комментария к другому ответу. Я пропустил окно, чтобы отредактировать его обратно: p - person Saggio; 28.10.2011