Windows 文件清理脚本

情况描述

有一台Windows Server服务器,开启FTP用来存储Java应用dump文件,需要定时清理,考虑有两种清理方案:

方案一:
在Linux通过挂载Windows共享目录,cifs 文件系统,通过Shell 脚本 + 定时任务清理(这个用find + crond 就可以,不赘述)

mount -t cifs -o username=win-username,password=win-pasword,uid=linux-username,gid=linux-group  //win-ip/path  /mount_dir_path

方案二:
在Windows写bat脚本,通过计划任务程序加载定时任务执行清理

需求描述

需求一:需要清理7天前的dump
需求二:需要清理同一个系统的dump,保留一个(目前没验证保留的是否最新文件)

脚本内容

需求一

一、dos 测试
win + r ,输入cmd
或者
鼠标右键桌面左下角win标识,选择运行,输入cmd

注意:
1、不要用Windows PowerShell dir显示内容不一样,而且计划任务程序默认加载的也是cmd ,bat的默认执行程序也是cmd
2、注意目录路径

# 打印查询结果,验证文件是否是目标文件
> forfiles /P "E:\dump" /M *.hprof /D -7 /C  "cmd /c echo @file"
> forfiles /?     # 查看帮助文档
    /P 地址
    /M 模糊匹配
    /D -7 代表7天前
    /C 后面跟命令
    "cmd /c del/F/s/q @file" 删除文件
    "cmd /c echo @file"      打印文件
> forfiles /P "E:\dump" /M *.hprof /D -7 /C  "cmd /c del/F/s/q @file"

二、脚本内容
新建一个文件,后缀修改为bat,右键,选择编辑

如果看不到后缀,打开文件浏览器,最上面菜单查看,找到文件扩展名,勾选

输入上面测试过的内容(注意路径):

@echo off
forfiles /P "E:\dump" /M *.hprof /D -7 /C  "cmd /c del/F/s/q @file"

双击,测试和验证清理效果

三、添加任务计划程序
Win+R,调出运行窗口,输入compmgmt.msc 进入计算机管理

鼠标右键桌面左下角Win图标,选择计算机管理

系统工具 》 任务计划程序 》任务计划程序库 》 右边窗口操作底下的基本任务 》 按照指引填写 注意选择脚本,保存即可

测试运行,找到自己的任务,鼠标右键,运行,验证脚本执行情况

历史记录可以查看历史运行情况,如果看不到,操作窗口,点击启用所有任务历史记录即可

需求二

步骤基本一致,这里就直接贴脚本和注意事项了

@echo off
setlocal enabledelayedexpansion
rem 定义磁盘路径
set "disk=E:\"

rem 进入工作目录
cd /d E:\dump

rem 获取磁盘信息
for /f "tokens=3" %%a in ('dir %disk% ^| find "可用字节"') do set "freeSpace=%%a"

rem 将字节数转换为GB
set /a freeSpaceGB=%freeSpace%/1073741824
rem 设置阈值
set "thresholdGB=250"

echo ############ >> "E:\cleanscritps\%date:~0,4%-%date:~5,2%-%date:~8,2%.txt"
echo %date% %time% >> "E:\cleanscritps\%date:~0,4%-%date:~5,2%-%date:~8,2%.txt"

echo free disk: %freeSpaceGB% GB >> "E:\cleanscritps\%date:~0,4%-%date:~5,2%-%date:~8,2%.txt"

rem 判断剩余容量是否小于阈值
if %freeSpaceGB% lss %thresholdGB% (
    echo 需要清理文件,剩余容量为 %freeSpaceGB% GB
    rem 在这里可以添加清理文件的操作
    rem 获取当前目录文件的文件名
    for /r %%F in (*.hprof) do (
        rem 依据下划线分割获取第一段文件名的文本
        for /f "tokens=1 delims=_" %%A in ("%%~nxF") do (
        rem 清理相同前缀的文件,保留一份
        if not defined prefix[%%A] (
            set prefix[%%A]=1
        ) else (
            echo "%%F" 
            echo delete file "%%F" >> "E:\cleanscritps\%date:~0,4%-%date:~5,2%-%date:~8,2%.txt"
            del /q "%%F"
        )
        )
    )
) else (
    echo 不需要清理文件,剩余容量为 %freeSpaceGB% GB  >> "E:\cleanscritps\%date:~0,4%-%date:~5,2%-%date:~8,2%.txt"
)

endlocal
rem pause

注意事项:
1、注意如果你的脚本和目标文件不在C盘,切换磁盘需要添加 /d 参数,否则不生效,找不到文件,脚本会执行,但是无法达到预期

cd /d E:\dump

2、set “disk=E:” 这个是设置参数,并不是将工作目录设置到E盘
3、>> 这个重定向和Linux一样,是追加的意思
4、date 的格式化输出

echo %date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%
2023-12-21_21
echo %date:~0,4%-%date:~5,2%-%date:~8,2%
2023-12-21

5、注意 bat 和 cmd 对于对象的取值

% 用于cmd dos 窗口
%% 用于批处理(bat)
%date% 取变量值

bat 脚本中如下脚本可以执行:
for /f "tokens=3" %%a in ('dir D: ^| find "可用字节"') do set "freeSpace=%%a"

dos 窗口执行报错
此时不应有 %%a。

dos 窗口测试需要如下方式:
for /f "tokens=3" %a in ('dir D: ^| find "可用字节"') do set "freeSpace=%a"

6、对于循环结构里面的解释

# 遍历符合条件的文件,并定义变量F 比如 E:/dump/xxx.hprof
for /r %%F in (*.hprof) do
# 取文件名全称,然后通过下划线分隔,打印第一段给到变量A
for /f "tokens=1 delims=_" %%A in ("%%~nxF") do
%%~nxF 仅将 %F 扩展到一个文件名和扩展名,比如 xxx.hprof
"tokens=1 delims=_"  %%A 是指 '_' 分隔,第一段 赋值给 A
/f 指会打开文件
# 定义一个类似字典的数据结构
prefix[%%A] 

具体见:
for /?

7、注意计划任务是调用的 C:\Windows\System32\cmd.exe
8、bat 脚本的三种运行方式

1)双击
2)拖动到cmd命令窗口执行 或者 输入bat脚本全路径执行
3)任务计划程序添加任务执行程序

你可能感兴趣的:(运维,实用技巧系列,windows,服务器,运维)