windows下bat脚本删除指定进程日志

2023-12-21 19:51:11

????????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 机器上,就很难保证在每台机器上的安装目录的一致性。

????????当然也可以考虑在程序内部将日志输出到一个固定目录,这样删除历史日志时就无需通过进程来查找了。

????????以上,欢迎交流~

文章来源:https://blog.csdn.net/yang1018679/article/details/135137455
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。