Пакетный файл / скрипт Удалить каждые 3 файла в каталоге - PullRequest
0 голосов
/ 19 октября 2010

У меня есть папка с последовательно названными изображениями (a0001, a0002, a0003 и т. Д.), И мне было интересно, есть ли способ удалить каждые 3 файла, не касаясь других.

Так, например,У меня есть: a0001, a0002, a0003, a0004, a0005 a0006, a0007, a0008, a0009

И после того, как я хотел бы иметь: a0001, a0005, a0009

Ответы [ 3 ]

0 голосов
/ 19 октября 2010

Вот vbscript, который вы можете использовать

strFolder = WScript.Arguments(0)
Set objFS = CreateObject( "Scripting.FileSystemObject" )
Set objFolder = objFS.GetFolder(strFolder)
i=0
For Each strFile In objFolder.Files
    If i Mod 4 <> 0 Then
        WScript.Echo strFile.Name
        objFS.DeleteFile(strFile.Name)
    End If
    i=i+1
Next

Использование:

C:\test> cscript //nologo test.vbs c:\folder_to_process
0 голосов
/ 27 октября 2010

Вот решение.Это позволяет вам указать, что удалять (например, c:\temp\*.tmp), сколько файлов пропустить (по умолчанию это 3, как вы просили) и какой порядок использовать (по умолчанию это n - имя файла).Вы можете использовать любой порядок DIR, например, N (имя) или ES (расширение, затем размер), см. dir /?, чтобы узнать больше о заказе.Не следует начинать команду заказа с /o (в отличие от dir) - она ​​автоматически добавляется.

Источник: ndel.bat

@echo off
::: ndel - Deletes every nth file matching the spec
::: syntax: ndel.bat FILESPEC [skipcount] [sortorder]
:::           FILESPEC  - Files to be searched through
:::           skipcount - number of files to skip (optional - default 3)
:::           sortorder - File order (see: DIR for options - default N (name))

:: With no arguments show the above usage text
if "%~1"=="" findstr "^:::" "%~f0"&GOTO:EOF
set find=%1
set evry=4
set ord=n
if "%~2" neq "" set /a evry=(%2+1)
if "%~3" neq "" set ord=%3

set count=0
for /f %%f IN ('dir %find% /b /o%%ord%%') do (
    call :test_file "%%f"
)
GOTO:eof

:test_file
set /a _r="%count% %% %evry%"
if %_r%==0 echo %1
::-to delete- if %_r%==0 del %1
set /a count+=1
GOTO:eof

Примечания:

  • Вам нужно закомментировать if %_r%==0 echo %1 и удалить начальный комментарий ::-to delete-, чтобы фактически выполнить удаление (как только вы будете довольны:)).
  • Первые несколько строк просто выводят использование, если вы набираете ndel (без параметра)
  • Пропустить три - это то же самое, что сказать удалить каждый четвертый файл, поэтому evry принимает пропуск +1, и по умолчанию установлено значение 4 (пропустить 3).
  • filespec может включать в себя папку и сложные подстановочные знаки (как dir).
  • Подпрограмма имеетдля правильного использования count через for (переменные среды внутри цикла FOR раскрываются в начале цикла и не изменятся до после конца DOраздел)
  • Вызов ndel c:\temp\*.tmp 0 совпадает с del c:\temp\*.tmp (так как пропуск 0 = все)
0 голосов
/ 19 октября 2010

Я не уверен насчет синтаксиса, так как обычно я не пишу пакетные сценарии, но должно быть что-то вроде:

set z = 0
for /f %%a IN (‘dir /b *’) do {
  set z = z + 1;
  if (z % 3 == 0) del %%a
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...