2017-02-15 7 views
0

В настоящее время я работаю над своей первой младшей ИТ-позицией, и у меня возникают проблемы с простым командным файлом.Запланированная очистка папок - пакетный файл

По существу, файл запускается еженедельно через планировщик задач. Он удаляет файлы и папки из каталога сервера старше 8 дней. Также предполагается удалить пустые папки.

forfiles /p "P:\blahblah" /s /m * /d -8 /c "cmd /c del /Q /S /F /A @path" 
cd /d P:\blahblah 
for /f "usebackq" %%d in (`"dir /ad/b/s | sort /R"`) do rd "%%d" 
REM robocopy "P:\blahblah" "P:\blahblah" /s /move" 

Здесь есть две проблемы; Иногда файлы удаляются только несколько дней назад. Он не удалит пустые папки.

Файл написан старым младшим ИТ-специалистом и документации нет. Мое предположение заключается в использовании нескольких методов для обеспечения очистки (по иронии судьбы). Я искал google и вот мои текущие мысли по каждой команде.

1) forfiles - команда forfiles, кажется, написана правильно, и я не вижу никаких проблем с ней.

2) CD - достаточно

3 простых) для - не совсем уверен. Пакетные переменные являются новыми для меня, и я не уверен, что он работает правильно.

4) robocopy - я не смог найти экземпляр онлайн, где кто-то копирует каталог для очистки. Я также замечаю дополнительную цитату там, но я не уверен в ее некорректности. Эта линия особенно кажется странной для меня.

Обычно я пытаюсь проверить свое действие через что-то подобное, но это немного сложнее проверить быстро, так как мне нужно выяснить, удаляет ли он вещи в зависимости от даты календаря. Вот почему я здесь!

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

Благодарим за помощь!

+0

Ваша команда FOR выйдет из строя, потому что ей не хватает каретки, чтобы выйти из PIPE. Также команда FOR должна действительно использовать опцию delims, чтобы заставить ее не использовать какие-либо разделители. Вам также не нужно использовать опцию usebackq. Robocopy не выполняется, поскольку он закомментирован командой REM. – Squashman

ответ

0
  1. forfiles

    Будучи синтаксически корректен не означает, что она делает то, что вы хотите, это то, что вы спрашиваете. Здесь проблема заключается в команде del. Он удалит то, что выбрал forfiles, но вы должны проверить, что выбранный элемент не является папкой. Если вы вызываете del /q /s /f /a с ссылкой на папку, вы удаляете содержимое папки.

  2. cd

    достаточно просто, но, как вы не проверяете операция была успешна (возможно P: не доступен), может быть следующее for команды удаляет информацию, где он не должен.

  3. for

    Как Squashman комментарии, если изменить обратные кавычки в одинарные кавычки, вы не будете нуждаться в usebackq.

    Но вам нужно предложение delims, чтобы избежать проблем с путями, содержащими пробелы.for /f не перебирает ссылки на файлы, а поверх строк текста (в этом случае генерируется командой dir). По умолчанию вкладки и пробелы являются разделителями, которые разбивают обрабатываемые строки, а также по умолчанию извлекается только первый токен. Если установить delims в пустой список символов, это приведет к отключению этого поведения.

Вы можете попробовать что-то вроде

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    pushd "p:\blahblah" && (
     forfiles /s /m * /d -8 /c "cmd /c if @isdir==FALSE del /q /f /a @path" 
     for /f "delims=" %%d in ('" dir /ad /s /b | sort /R "') do rd "%%d" 
     popd 
    ) 

pushd изменит текущую активную директорию к требуемому. Если команда выполнена успешно, условный оператор && (выполнить следующую команду, если предыдущий не завершился с ошибкой) выполнит оставшуюся часть кода, восстановив активный каталог в конце.

4) robocopy

Он может быть использован, чтобы сделать чистый, но не из папки в себя.

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    pushd "p:\blahblah" && (
     rem Use a random temporary folder 
     for %%t in ("%temp%\clean_%random%%random%%random%%random%.tmp") do (

      rem Select the files to keep 
      robocopy "." "%%~ft" /MAXAGE:8 /CREATE /s /njh /njs /nfl /nc /ns 

      rem Remove anything not selected 
      robocopy "%%~ft" "." /NOCOPY /PURGE /e /njh /njs /nfl /nc /ns 

      rem remove temporary folder 
     ) & rd /s /q "%%~ft" 

     rem Restore previous active directory 
     popd 
    ) 

Этот код создает копию всех выбранных файлов (не старше 8 дней) во временную папку, а переключатель /CREATE говорит robocopy, чтобы не копировать файлы, но и создать 0 байт файлы во временную цель.

Как только у нас есть реплика только с выбранными элементами, операция oposite выполняется из временной папки в рабочую папку, но запрашивает, чтобы операция копирования не выполнялась (/NOCOPY), просто удаление элементов, отсутствующих в источнике (/PURGE).

+0

Спасибо за помощь MD. Я расскажу об этом и уточню результаты. – Boognish