4

У меня есть работающая структура папок веб-сайта Magento 2.x в моей 64-битной системе Windows 7 по пути C:\UwAmp\www\magento2root .

Теперь эта корневая папка Magento содержит следующие пары каталог-подкаталог в качестве прямых потомков (например, [magento2root]/var/cache):

var/tmp
var/cache
var/page_cache
var/generation
var/view_preprocessed
var/composer_home
var/log
var/report
var/session
pub/static

Теперь некоторые из указанных выше путей содержат файл .htaccess(например, pub/static/.htaccess), который я хочу сохранить, и мне нужно удалить весь контент (файлы, подпапки, подпапки и т.д.), Кроме их соответствующих .htaccess файл всех упомянутых путей, через единый скрипт.

Ниже приведены команды, которые я пытался вставить в скрипт (для pub/static), но они также удаляют .htaccess:

del /q "%cd%/pub/static/.htaccess/*"
FOR /D %%p IN ("%cd%/pub/static/.htaccess"/*.*) DO rmdir "%%p" /s /q

Так как я не являюсь Windows Batch-сценаристом, я делаю этот процесс вручную, может кто-нибудь помочь мне с сценарием?

1 ответ1

2

Я хочу сохранить и мне нужно удалить весь контент (файлы, подпапки, подпапки и т.д.), Кроме соответствующего файла .htaccess всех указанных путей, с помощью одного скрипта.

Вы можете использовать цикл FOR /F и команду DIR с параметром /A-D для исключения папок и рекурсивного просмотра каталога для *.* Вы можете использовать условную логику IF чтобы сказать, что если итеративный файл для команды DIR равен имени .htaccess , то не удаляйте этот файл. В противном случае он перейдет к файлам DEL с другими именами.

Теперь, когда очистка файла завершена, вы можете использовать Robocopy с одинаковыми исходными и целевыми путями, которые на данный момент должны быть всеми, кроме тех, которые содержат файлы .htaccess .


Пакетный скрипт

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

Примечание . Верхний цикл FOR (%%A) будет списком имен вложенных папок \ путей под папками родительского уровня основного каталога, к которым вы хотите применить только очистку.Вы можете использовать команду CALL и передать итеративное значение в качестве первого аргумента подпрограмме, которая затем установит окончательный полный путь расположения папок для рекурсивного запуска очистки.

@ECHO ON

FOR %%A IN (test,site1,site2\folder,pub\static) DO (CALL :routine "%%~A")
GOTO :EOF

:routine
SET SrcDir=C:\UwAmp\www\magento2root\%~1
FOR /F "TOKENS=*" %%p IN ('DIR /S /B /A-D "%SrcDir%\*.*"') DO IF NOT [%%~nxp]==[.htaccess] DEL /Q /F "%%~p"
ROBOCOPY "%SrcDir%" "%SrcDir%" /S /MOVE
IF NOT EXIST "%SrcDir%" MD "%SrcDir%"
GOTO :EOF

Дополнительные ресурсы

  • ВЫЗОВ
  • ЗА
  • FOR /F

    • Пакетные замены (ЗА /?)

    Кроме того, была улучшена замена ссылок на переменные FOR. Теперь вы можете использовать следующий необязательный синтаксис:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    
  • DIR

    /A Displays files with specified attributes. attributes D Directories R Read-only files H Hidden files A Files ready for archiving S System files I Not content indexed files L Reparse Points - Prefix meaning not

  • ЕСЛИ

  • DEL
  • Robocopy

    /S :: copy Subdirectories, but not empty ones.

    /MOVE :: MOVE files AND dirs (delete from source after copying).

  • Мэриленд


Бонусный массив как переменная в пакете

Вы можете поместить переменную массива в различные форматы, чтобы затем использовать ее в качестве (set) значения части цикла FOR(примеры ниже). Вы должны проверить выбранный формат и подтвердить правильность каждого повторного значения с помощью команды ECHO как в моем примере, прежде чем использовать его для других команд. Я прокомментировал несколько вариантов ниже, но я уверен, что есть другие методы, но это всего лишь бонусный материал этого метода в целом.

Кроме того, у меня есть ответ о копировании массива в пакетном файле для другого потенциального метода, который вы могли бы использовать для эмуляции массива с индексированием и повторением последующих значений соответственно и с использованием стандартов для переменных подпрограммы, которые устанавливаются перед обработкой коррелированных команд.

@ECHO ON

::SET array=1,2,3,4,"5","6","7/7","8"
::SET array=1,2,3,4,5,6,7/7,8
::SET array=1 2 3 4 5 6 7/7 8
SET array=1 2 3 4 5 6 "7 / 7" 8
FOR %%A IN (%array%) DO ECHO %%~A
PAUSE

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .