
Я пытаюсь найти способ заставить пакетный скрипт перезаписывать каждый экземпляр файла с ненулевым размером внутри определенного каталога и его подпапок. Я предполагаю, что поскольку я ищу ненулевой файл, я, вероятно, мог бы зациклить его с помощью escape, если он не найдет ни одного файла с ненулевым размером?
Пример: перезаписать все экземпляры example.txt, где размер файла не равен нулю:
D:\
\---SubFolder1
| example.txt <10 bytes>
|
\---Subfolder2
| example.txt <0 bytes>
|
\---Subsubfolder1
example.txt <20 bytes>
В этом примере D:\Subfolder1\example.txt и D:\Subfolder2\Subsubfolder1\example.txt будут перезаписаны, но D:\Subfolder2\example.txt не будет изменен.
Спасибо @NiKiZe за всю твою помощь!
Рабочий код:
@ЭХО ВЫКЛ
УСТАНОВИТЬ DPATH=%~dp0
ДЛЯ /R "%DPATH%" %%F В (*** СМ. НИЖЕ) ДЕЛАЙТЕ ЕСЛИ %%~zF
ГТРНЭК0 ВЫЗОВ :NonEmptyFile "%%~F"
ПЕРЕЙТИ К :EOF:NonEmptyFile
ECHO Получен непустой файл: %1
ВЫЗОВ : EOF
*** Замените именем файла, который вы хотите заменить, обязательно используйте где-нибудь подстановочный знак из одного символа (я использовал его в расширении — например, если я ищу example.txt, я заменил * на example.t?t)
решение1
Минимальный пакет, который проходит по заданному пути и всем подфайлам и подпутям, вызывая NonEmptyFile
метку для каждого непустого файла.
@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
При использовании %~1
функции она будет расширена, и вы можете использовать что-то вроде COPY /Y "somefile.txt" "%~1"
Не указано, как именно вы хотите перезаписать файлы.
Другой вариант создания «пустых файлов» —ECHO. > "%~1"
Объяснение:
FOR /R "%DPATH%" %%F IN (*) DO
просматривает каждый файлIF %%~zF GTR 0
если размер файла больше ...CALL :NonEmptyFile "%%~F"
Вызовите:NonEmptyFile
метку с экранированным именем файла
Чтобы проверить это в командной строке, используйтеFOR /R "D:\SubFolder1\" %F IN (*) DO IF %~zF GTR 0 ECHO NonEmptyFile "%~F"
Более подробную информацию о том, как for
это работает, можно получить, for /?
запустивcmd