Назад | Перейти на главную страницу

Скрипт Windows для создания каталогов из 3000 файлов

У нас есть архивирование электронной почты, которое сбрасывает все электронные письма в каталог. Из-за некоторых причин производительности сервера я хочу настроить автоматическую задачу, которая будет запускать сценарий один раз в день, и если в главном каталоге более 3000 (или любое другое количество) файлов, создайте новый каталог с датой и переместите в него все файлы основного каталога. Я уверен, что кто-то уже написал нечто подобное, так что, если бы кто-нибудь мог указать мне на это, было бы здорово. Пакетный файл или Powershell подойдут.

Написано и протестировано. Скопируйте следующий код в файл * .bat. Вы захотите изменить каталог, в котором существуют электронные письма, в начале кода. Переменная cBig уже установлена ​​на 3000, но вы можете изменить это, если хотите. Внизу файл move * .txt необходимо будет изменить, чтобы отразить расширение перемещаемых писем. После того, как вы протестировали его и остались довольны, вы можете удалить команды паузы ... они просто помогают увидеть, что происходит. Удачи!

echo off

REM **navigate to the directory
cd\bat_test

REM **store count of files to file count.txt (/a-d removes folders from count)
dir /b /a-d | find /v /c "::" > count.txt

REM **read count back in to variable (easiest way I knew how to do this)
set /p myvar=<count.txt

REM **set your upper limit (in your case 3000)
set cBig=3000



REM **quick display of the number of files
echo %myvar%

pause


REM **is the number of files larger than our upper limit? If so goto BIG
if '%myvar%' gtr '%cBig%' goto BIG



:SMALL
REM **do nothing
exit


:BIG
REM **create new directory with date and move all files
Set FDate=%Date:~-10,10%
Set Fdate=%FDate:/=-%
MD %FDate%
move *.txt ./%FDate%

pause

Непроверенный скрипт .CMD.

REM @echo off
setlocal enableextensions enabledelayedexpansion

  rem Print all filenames (excl. folders) in current directory into temporary text-file
  set TMPTXT=%TEMP%\%~n0.%RANDOM%.TMP
  dir /B /A-D  1>%TMPTXT%

  rem Count number of files (lines) in text-file
  set FILECNT=0
  for /F %%i in (%TMPTXT%) do (
    set /A FILECNT=!FILECNT!+1
  )
  echo Number of files in folder: !FILECNT!

  rem Is number of files greater than expected?
  if /I !FILECNT! GTR 2999  call :MoveFiles

  del %TMPTXT%
  goto :EOF

:MoveFiles
  rem Construct a folder-name based on date (remember date changes at midnight)
  rem Since the date value is locale specific, you might want to fiddle with string-replacing.
  set SUBFLDR=%DATE%
  mkdir "%SUBFLDR%"
  if /I !ERRORLEVEL! NEQ 0 (
    echo Failed to create sub-folder '%SUBFLDR%'.
    goto :EOF
  )

  rem Move only those files found in text-file to the new folder.
  for /F %%f in (%TMPTXT%) do (
    move  "%%f"  "%SUBFLDR%\."
    if /I !ERRORLEVEL! NEQ 0  echo Failed to move file '%%f'
  )
  goto :EOF