
メール アーカイブですべてのメールをディレクトリにダンプしています。サーバーのパフォーマンス上の理由から、1 日に 1 回スクリプトを実行し、メイン ディレクトリに 3,000 個 (または任意の数) を超えるファイルがある場合は、その日付で新しいディレクトリを作成し、すべてのメイン ディレクトリ ファイルをそのディレクトリに移動する自動タスクを設定したいと考えています。同様のものを既に作成している人がいるはずなので、どなたか教えていただけると助かります。バッチ ファイルでも Powershell でもどちらでも構いません。
答え1
作成およびテスト済み。次のコードを *.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
答え2
テストされていない .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