Script em lote único para limpar várias pastas, com exceção de um ou dois arquivos especificados anteriormente

4

Eu tenho uma estrutura de pastas do site Magento 2.x em execução no meu sistema Windows 7 de 64 bits, em C:\UwAmp\www\magento2root path.

Agora, esta pasta raiz do Magento contém os seguintes pares de subdiretórios de diretório como filhos diretos (por exemplo, [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

Agora, alguns dos caminhos acima contêm o arquivo .htaccess (por exemplo, pub / static / .htaccess), que desejo manter e preciso remover todo o conteúdo (arquivos, subpastas, sub-subpastas etc.) seu arquivo .htaccess relevante de todos os caminhos mencionados, através de um único script.

Abaixo estão os comandos que eu tentei colocar no script (por pub/static ), mas eles também excluem o .htaccess:

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

Como eu não sou muito de um scripter do Windows Batch, estou fazendo esse processo manualmente, alguém pode me ajudar com o script?

    
por Vicky Dev 18.05.2017 / 23:55

1 resposta

2

I want to keep and I need to remove all the content(files, subfolders, sub-subfolders etc.) besides their relevant .htaccess file of all the mentioned paths, through a single script.

Você pode usar um FOR /F loop e um DIR com a opção /A-D para excluir pastas e percorrer um diretório recursivamente para *.* . Você pode usar condicional IF logic para dizer se o arquivo iterado pelo comando DIR é igual a um nome de .htaccess , então não remova esse arquivo. Caso contrário, ele continuará para DEL arquivos com outros nomes.

Agora que a limpeza do arquivo foi concluída, você pode usar Robocopy com os caminhos de origem e de destino sendo os mesmos que, nesse ponto, devem ser todos, exceto para o aqueles contendo os arquivos .htaccess .

Script em lote

Importante: Certifique-se de testar isso em um local de teste para garantir que seja suficiente antes de executar em sistemas de produção.

Observação: O top FOR loop ( %%A ) será a lista de nomes de subpastas \ paths abaixo das pastas de nível pai do diretório principal que você deseja apenas a limpeza para aplicar a. Você pode usar o comando CALL e passar o valor iterado como o primeiro argumento para a rotina abaixo que, em seguida, definirá o caminho completo final dos locais da pasta para executar a limpeza contra recursivamente.

@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

Mais recursos

  • CALL
  • PARA
  • FOR / F

    • Substituições de lote (FOR /?)

    In addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax:

    %~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

  • SE

  • DEL
  • Robocopy

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

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

  • MD

Objeto de matriz de bônus como variável no lote

Você pode colocar a variável de matriz em vários formatos para usar como o valor de (set) de um loop FOR (exemplos abaixo). Você deve testar o formato escolhido e confirmar se cada valor iterado retorna corretamente com o comando ECHO , como no meu exemplo, antes de usar para outros comandos. Eu comentei algumas das variações abaixo, mas tenho certeza que existem outros métodos, mas este é apenas um material bônus deste método em geral.

Além disso, tenho uma resposta sobre copiar array em um arquivo de lote para outro método em potencial que você poderia usar para emular uma matriz com indexação e iterar os valores subsequentes de acordo e usar padrões para variáveis de sub-rotina que são definidas antes de os comandos correlacionados serem processados.

@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
    
por 20.05.2017 / 07:33