
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 %%~zF
GTRNEQ0 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 NonEmptyFile
ró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 %~1
na 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 (*) DO
percorre cada arquivoIF %%~zF GTR 0
se o tamanho do arquivo for maior que ...CALL :NonEmptyFile "%%~F"
Chame o:NonEmptyFile
ró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 for
funciona são fornecidas executando for /?
emcmd