????????windows 机器运行着一个客户端软件,每天会产生日志,需求就是删除30天的日志,防止占用过多磁盘空间。
????????首先可以设置两个固定变量,假设进程名为 cmd.exe:
rem 设置要查找的进程名和天数
set "processName=cmd.exe"
set "dayAgo=30"
????????接着需要根据进程名找到应用运行的目录:
rem 遍历所有正在运行的进程
for /f "tokens=2 delims==" %%a in ('wmic process where "name='%processName%'" get CommandLine /value ^| find "="') do (
rem 获取进程的命令行路径
set "commandLine=%%a"
rem 提取目录部分
for %%b in (!commandLine!) do (
set "processDirectory=%%~dpb"
rem 输出目录
echo Process Directory: !processDirectory!
break
)
)
????????这里需要判断进程目录?processDirectory 是否有限,也就是程序是否正在运行:
rem 检测进程是否运行,没有直接退出
if not defined processDirectory (
echo process '%processName%' is not running.
exit /b
)
????????如果程序正在运行,那么就切到对应的日志文件夹:
rem 切换到子目录
set "logDir=!processDirectory!loginfo"
echo %logDir%
cd /d %logDir%
????????找出 30 天以前的日志文件并写入 files.txt 文件:
rem 使用 forfiles 列出子目录下指定天数以前的所有文件
forfiles /s /p "!logDir!" /m *.* /d -%dayAgo% /c "cmd /c if @isdir==FALSE echo @path" > files.txt
????????再读取 files.txt 文件中的路径列表,依次删除:
rem 读取文件列表并删除文件
for /f "tokens=*" %%f in (files.txt) do (
set "filePath=%%f"
if exist "!filePath!" (
echo exist dir: !filePath!
del !filePath!
) else (
echo Directory does not exist: !filePath!
)
)
????????最后,删除记录指定日期之前日志文件路径的 files.txt 文件:
rem 删除临时文件列表
del files.txt
????????至此,就实现了删除日志文件的功能。之所以要根据进程名来查找文件目录,是因为该程序是我司自研的一个客户端软件,会部署在多台 windows 机器上,就很难保证在每台机器上的安装目录的一致性。
????????当然也可以考虑在程序内部将日志输出到一个固定目录,这样删除历史日志时就无需通过进程来查找了。
????????以上,欢迎交流~