跳到主要内容

在 Windows 上通过系统自带的 任务计划程序 来完成定时执行 PowerShell 脚本。


第一步:准备工作

在创建定时任务之前,请务必完成以下准备:

  1. 编写Powershell脚本Clean-Old-Folders.ps1,删除更新日期在60天以上的文件夹
    # ===================================================================
    # 脚本功能:删除指定目录中超过特定天数的【文件夹】及其所有内容
    # ===================================================================

    # --- 配置区域 ---
    # 设置要清理的目标目录
    $targetPath = "C:\backupMySQL"
    # 设置保留天数(超过此天数的文件夹将被删除)
    $daysToKeep = 60
    # --- 配置结束 ---


    # 检查目标目录是否存在
    if (-not (Test-Path -Path $targetPath)) {
        Write-Host "错误:目标目录 '$targetPath' 不存在!" -ForegroundColor Red
        Read-Host "按任意键退出"
        exit
    }

    # 计算截止日期
    $cutoffDate = (Get-Date).AddDays(-$daysToKeep)
    Write-Host "目标目录: $targetPath"
    Write-Host "将删除所有最后修改时间早于 $cutoffDate 的【文件夹】..." -ForegroundColor Yellow

    # --- 第一步:预览将要删除的文件夹 (安全模式) ---
    # 使用 -WhatIf 参数,它只会显示将要执行的操作,但不会真的删除。
    # 这是强烈推荐的安全检查步骤!
    Write-Host "`n--- 预览模式 (以下为将要删除的文件夹,并未实际删除) ---" -ForegroundColor Green
    Get-ChildItem -Path $targetPath -Recurse -Force | 
    # 关键筛选条件:只选择是文件夹 (.PSIsContainer) 且修改时间早于截止日期的项目
       Where-Object { $_.PSIsContainer -and $_.LastWriteTime -lt $cutoffDate } | 
       Remove-Item -Recurse -Force -WhatIf -Verbose

    # --- 第二步:确认后执行实际删除 ---
    # 当你确认预览列表无误后,取消下面几行代码的注释 (#) 来执行真正的删除操作。
    # 警告:此操作不可逆!
    #
    # Write-Host "`n--- 正在执行删除操作... ---" -ForegroundColor Red
    # Get-ChildItem -Path $targetPath -Recurse -Force | 
    #   Where-Object { $_.PSIsContainer -and $_.LastWriteTime -lt $cutoffDate } | 
    #   Remove-Item -Recurse -Force -Verbose
    # Write-Host "`n清理完成!" -ForegroundColor Green

2. 确定脚本的最终位置
将创建的 Clean-Old-Folders.ps1 文件移动到一个固定、不会被轻易移动或删除的目录。例如:C:\Scripts\Clean-Old-Folders.ps1。不要把它放在桌面或临时文件夹里。

3.确保脚本可以独立运行

  • 手动执行一次:右键点击 Clean-Old-Folders.ps1 -> “使用 PowerShell 运行”,确保脚本本身没有语法错误,并且逻辑正确(已经完成了预览和正式删除的测试)。
  • 解决执行策略问题:如果脚本无法运行,可能是因为 PowerShell 的执行策略限制。你可以在 PowerShell 窗口中运行 Set-ExecutionPolicy RemoteSigned 并选择 Y 来允许本地脚本运行。

第二步:创建基本定时任务

使用“创建基本任务”向导,按照顺序操作。

  1. 打开任务计划程序
    • 按下 Win + R 键,打开“运行”对话框。
    • 输入 taskschd.msc 然后按回车。
  2. 创建基本任务
    • 在右侧的“操作”面板中,点击 “创建基本任务…”
  3. 填写名称和描述
    • 名称: 给任务起一个有意义的名字,例如 MySQL备份清理任务。
    • 描述 (可选): 可以写得更详细一些,例如 删除C:\backupMySQL目录下超过60天的文件夹。
    • 点击 “下一步”
  4. 设置触发器(何时执行)
    • 选择你希望任务执行的频率。对于清理任务,“每天” 是最常见的选择。
    • 点击 “下一步”
    • 设置具体的执行时间。例如,选择一个服务器负载较低的时间,比如凌晨 0:05:00
    • 点击 “下一步”
  5. 设置操作(执行什么)
    • 选择 “启动程序”
    • 点击 “下一步”
    • 这是最关键的一步,请仔细填写:
      • 程序/脚本: 这里填的不是你的 .ps1 文件!而是 PowerShell 的可执行文件。直接输入 powershell.exe
      • 添加参数(可选): 这里是告诉 powershell.exe 要做什么的地方。输入以下内容(请根据你的实际路径修改):
        -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Scripts\Clean-Old-Folders.ps1"

        -NonInteractive: 非交互模式,防止脚本在需要用户输入时卡住。
        -WindowStyle Hidden: 隐藏执行时的 PowerShell 窗口,让任务在后台静默运行。
        -ExecutionPolicy Bypass: 非常重要!这个参数会为本次执行临时绕过系统的执行策略限制,确保你的脚本能运行,且不会改变系统全局设置。
        -File "..."`: 指定要执行的脚本文件的完整绝对路径。路径最好用双引号括起来,以防有空格。
      • 起始于(可选): 可以留空,或者填写脚本所在的目录,例如 `C:\Scripts`。这有助于脚本正确解析相对路径。
  1. 完成创建
    • 检查一下摘要信息,确认无误后,点击 “完成”

第三步:高级设置与最佳实践

基本任务创建完成后,我们还需要做一些高级设置,让任务更健壮。

  1. 找到并编辑任务
    • 在任务计划程序库的中间列表中,找到你刚刚创建的任务(例如 MySQL备份清理任务)。
    • 右键点击它,选择 “属性”
  2. 常规选项卡
    • 安全选项: 这是最重要的设置
      • 选择 “不管用户是否登录都要运行”。这能确保即使服务器重启后没有人登录,任务也能执行。
      • 勾选 “使用最高权限运行”。因为你的脚本要删除 C:\backupMySQL 下的文件,可能需要管理员权限。
      • 点击 “更改用户或组…”,输入 SYSTEM 或 Administrators 并检查名称,使用系统账户或管理员账户运行更稳定。SYSTEM 是最推荐的,因为它拥有最高权限且不需要密码。
  3. 设置选项卡
    • 勾选 “如果任务失败,按以下频率重新启动”,并设置为每隔 1 分钟,尝试次数 3 次。这可以应对一些临时性的网络或系统问题。
    • 勾选 “如果任务运行时间超过以下时间,停止任务”,可以设置为 1 小时,防止任务因意外原因卡死。
    • “如果任务计划程序已在运行此任务,以下规则使用” 中选项改为 “请勿启动新实例”,防止任务重叠执行。
  4. 保存设置
    • 点击 “确定”。如果更改了用户,系统可能会要求你输入账户密码。

第四步:测试与验证

  1. 手动运行测试
    • 在任务列表中右键点击任务,选择 “运行”
    • 等待几秒钟。由于设置了 -WindowStyle Hidden,不会看到任何窗口。
    • 去检查 C:\backupMySQL 目录,看看符合条件的文件夹是否被删除了。
  2. 检查历史记录
    • 如果任务没有按预期工作,右键点击任务 -> “属性” -> 切换到 “历史记录” 选项卡。
    • 这里会记录任务的每一次运行状态(成功、失败)和详细的事件信息。如果失败了,这里会提供错误代码和原因,是排错的关键。

留下回复