Código de trabalho:

Código de trabalho:

Estou tentando descobrir uma maneira de fazer com que um script em lote substitua todas as instâncias de um arquivo de byte diferente de zero dentro de um diretório específico e suas subpastas. Suponho que, como estou procurando um arquivo diferente de zero, provavelmente poderia fazer um loop com um escape se ele não encontrar nenhum arquivo de tamanho diferente de zero.

Exemplo, substitua todas as instâncias de example.txt onde o tamanho do arquivo for diferente de zero:

D:\
\---SubFolder1
    |   example.txt <10 bytes>
    |
    \---Subfolder2
        |   example.txt <0 bytes>
        |
        \---Subsubfolder1
                example.txt <20 bytes>

No exemplo, D:\Subfolder1\example.txt e D:\Subfolder2\Subsubfolder1\example.txt seriam substituídos, mas D:\Subfolder2\example.txt não seria alterado.

Obrigado a @NiKiZe por toda sua ajuda!

Código de trabalho:

@ECO DESLIGADO

DEFINIR DPATH=%~dp0

FOR /R "%DPATH%" %%F IN (*** VEJA ABAIXO) FAÇA SE %%~zFGTR NEQ0 CHAMADA:NonEmptyFile "%%~F"
GOTO:EOF

:NonEmptyFile
ECHO Obteve arquivo não vazio: %1
CHAMADA: EOF

*** Substitua pelo nome do arquivo que você deseja substituir, certifique-se de usar um caractere curinga de um único caractere em algum lugar (usei-o na extensão - por exemplo, se estou procurando por exemplo.txt, substituí o * por exemplo.t ?t)

Responder1

Lote mínimo que percorre um determinado caminho e todos os subarquivos e subcaminhos, chamando o NonEmptyFilerótulo para cada arquivo não vazio.

@ECHO OFF

SET DPATH=%~dp0

FOR /R "%DPATH%" %%F IN (*) DO IF %%~zF GTR 0 CALL :NonEmptyFile "%%~F"
GOTO :EOF

:NonEmptyFile
  ECHO Got non empty file: %1
CALL :EOF

Ao usar %~1na função ela será expandida e você poderá usar algo como COPY /Y "somefile.txt" "%~1" Como você deseja sobrescrever os arquivos não foi especificado.

Outra opção para criar "arquivos vazios" éECHO. > "%~1"

Explicação:

  • FOR /R "%DPATH%" %%F IN (*) DOpercorre cada arquivo
  • IF %%~zF GTR 0se o tamanho do arquivo for maior que ...
  • CALL :NonEmptyFile "%%~F"Chame o :NonEmptyFilerótulo com o nome do arquivo escapado

Para testar isso imediatamente, useFOR /R "D:\SubFolder1\" %F IN (*) DO IF %~zF GTR 0 ECHO NonEmptyFile "%~F"

Mais informações sobre como forfunciona são fornecidas executando for /?emcmd

informação relacionada