Я сделал скрипт Windows bat для архивации старых файлов из списка. Любые предложения по синтаксису кода?

Не уверен, для чего предназначен setlocal, но я нашел его в примере скрипта для чего-то еще, что требовало нескольких команд в цикле for.

Filelist.txt содержит список файлов с полным путем к общему ресурсу.

Например: \\FileShare\Division\Project\file.txt

setlocal enabledelayedexpansion
for /f "delims=" %%i in (filelist.txt) do (
mkdir "D:\Archive\%%~dpi"
move "%%i" "D:\Archive\%%i")
endlocal

Сценарий берет файлы из filelist.txt (построчно) и копирует структуру каталогов пути, а затем перемещает файл. Используя мой пример выше, он создает каталог D:\Archive\FileShare\Division\Project\, а затем перемещает файл file.txt в этот каталог.

Я как бы собрал это из существующих примеров различных задач, которые я нашел здесь. Есть советы по очистке?

Изменить: чтобы ответить на комментарий ниже. Сценарий был создан для работы с отчетом о файлах, к которым не обращались более года. Вот почему мне нужно было работать со списком файлов, потому что я хотел сохранить структуру папок и все остальные файлы нетронутыми. Если бы был какой-то способ интегрировать это в сценарий, было бы здорово!


person Tetsuya    schedule 10.01.2013    source источник
comment
Для вашего приложения было бы более целесообразно скопировать все файлы/папки, взятые из списка каталогов, вместо того, чтобы перечислять каждый файл, который вы хотите заархивировать?   -  person will    schedule 10.01.2013
comment
@will Этот скрипт работал на основе списка, сгенерированного отчетом. Отчет относился ко всем файлам, к которым не обращались в течение последнего года или более. Есть ли способ просто интегрировать это в сценарий?   -  person Tetsuya    schedule 10.01.2013


Ответы (1)


Вам не нужны delayed expansion или setlocal. setlocal изолирует область раздела, чтобы любые изменения, внесенные в переменные, оставались изолированными от этой области. Отложенное расширение необходимо только в том случае, если вы расширяете переменные внутри циклов или операторов if. С вашим сценарием не так уж много нужно очистить. Если он выполняет ваши задачи без проблем и делает это эффективно, то нет необходимости в изменениях.

Изменения и почему

  1. setlocal EnableExtensions Изоляция области не требуется, но необходимо включить расширения, чтобы использовать параметр for /f.
  2. %%F вместо %%i, потому что заглавные буквы легче отличить от модификаторов. (Читаемость)
  3. if exist "%%~fA", чтобы убедиться, что файл в списке все еще существует при запуске скрипта.
  4. for /f "tokens=1 delims=:" %%D in ("%%~dF") do, потому что имена папок не могут содержать двоеточия. Это удалит символ двоеточия из пути к файлу для диска.
  5. && Попробуйте переместить файл только в том случае, если место назначения было успешно создано.

Код:

rem Hide the Command Output.
@echo off
rem Isolate Variable Scope and Enable Extensions.
setlocal EnableExtensions
rem Loop through the file list and verify file existence.
for /f "delims=" %%F in (filelist.txt) do if exist "%%~fF" (
    rem Parse the drive letter since colon : is not a valid folder character.
    for /f "tokens=1 delims=:" %%D in ("%%~dF") do (
        rem Create the folder hierarchy
        mkdir "D:\Archive\%%~D\%%~pF" && move "%%~fF" "D:\Archive\%%~D\%%~pF"
    )
)
endlocal
person David Ruhmann    schedule 10.01.2013
comment
Спасибо, Дэвид! Мне было интересно, как получить это: удалено. Звучит как хороший список, я попробую их и откорректирую в соответствии с ними. - person Tetsuya; 12.01.2013