在Windows下利用PowerShell脚本定时删除过期文件


公司有一台 Windows server 2008 R2 服务器的空余磁盘空间比较多,打算利用起来作为其它服务器的远程备份。在配置好了IIS的FTP服务,并在Linux下完成了FTP备份脚本并加入到crontab之后,忽然想到自己忽略了一项工作,就是在Windows上定期删除过期的备份文件。
不过Windows上可不像Linux那么方便,一个find口令就能全部搞定,记得以前研究过DOS下用BAT脚本来处理,结果光在时间的判断上都搞了很久,不过还好目前Windows Server 2008 上都默认集成了PowerShell工具,Windows Server 2003 上也可以安装。
最后,我在参考了一些资料后,通过一个简单的PowerShell脚本加Windows计划任务,完成了这项工作。

相关步骤如下:
1.解除系统对PowerShell脚本执行的禁止
由于默认系统中PowerShell脚本没有足够的权限运行,因此我们需要手动修改并赋予其执行权限,步骤如下:
控制面板 - 管理工具 - Windows PowerShell Modules

PS C:\Windows\system32> Get-ExecutionPolicy
Restricted
PS C:\Windows\system32> Set-ExecutionPolicy RemoteSigned

执行策略更改
执行策略可以防止您执行不信任的脚本。更改执行策略可能会使您面临 about_Execution_Policies
帮助主题中所述的安全风险。是否要更改执行策略?
[Y] 是(Y) [N] 否(N) [S] 挂起(S) [?] 帮助 (默认值为“Y”): Y

至此,便解除了系统对PowerShell脚本执行的禁止。

2.编写PowerShell脚本
新建一个文本文件,命名为 del-expired.ps1内容如下:

echo "These expired files have been deleted:"

$a = Get-ChildItem E:\FTPbackup\servername 
#替换这里的 E:\FTPbackup\servername 为你的备份文件实际存放目录

foreach ($x in $a)
{
$y = ((Get-Date) - $x.LastWriteTime).Days
if ($y -gt 6 -and $x.PsISContainer -ne $True) #替换这里的 6 为你需要保留的实际天数
    {
    $x.Delete()
    echo $x
    }
}

因为我们发现Windows的计划任务不能直接调用PowerShell脚本来执行。所以,我们需要再新建一个文本文件,命名为del-expired.bat
内容如下:

powershell E:\FTPbackup\del-expired.ps1 
#替换这里的 E:\FTPbackup\del-expired.ps1  为你的脚本实际存放位置

3.使用Windows计划任务来定期执行脚本
控制面板-管理工具-任务计划程序-创建任务
配置如下:
常规:输入 名称,描述 - 勾选“不管用户是否登录都要运行” -输入密码 - 勾选“使用最高权限运行”
触发器:新建 - 选择“制定计划时” - 选择 执行时间如“7:30:00” - 选择执行周期如“每天 每隔1天发生一次” - 勾选“启用”
操作:新建 - 选择“启动程序” - “浏览”刚刚创建好的del-expired.bat脚本 - 点击“确定”

至此,计划任务就配置完成了,如果想要测试计划任务是否能正常执行,直接手动立即运行一次即可。

  1. #1 by ITwhy on 2011/08/02 - 10:14

    第一次听说 psl

    • #2 by mcsrainbow on 2011/08/02 - 16:43

      Windows的PowerShell应该就是为了服务器管理而生的,因为BAT实在是太难用,效率太低了。
      另外,PowerShell脚本后缀不是psl,是ps1,1是数字的1。

  2. #4 by ITwhy on 2011/08/09 - 15:45

    帮我把友情链接改下:

    站点名称:IT手记
    站点地址:http://www.itwhy.org/
    站点介绍:记录网维生涯的心得理会,专注于Linux、Windows、网络技术、PHP、WEB前端、SEO……

    记得加title哦!!!

    • #5 by mcsrainbow on 2011/08/09 - 16:30

      博客管理上你还挺专业的,呵呵,已经按照你的要求更新了。

  3. #6 by buzhizhe on 2011/11/24 - 14:02

    可能玩惯了linux的人都有脚本控,啥事都喜欢用脚本。不过既然用了windows,应该也不介意用c#写个简单的控制台程序搞定,这并不比写脚本麻烦多少,不需要机会任务+批处理+ps三者组合才搞定。。。

    • #7 by mcsrainbow on 2011/11/24 - 15:08

      你说的非常在理,不过惭愧的是本人没有开发方面的经验,尤其是在Windows平台上。

      • #8 by junxy on 2013/03/28 - 11:36

        上面是胡说吧,你见过那个网络管理员用C# 来写系统维护脚本,改一个参数还得编译一下,这不累死去,这MS 还搞个 PS 干什么?

  4. #9 by Marcus on 2013/09/13 - 12:52

    这个只能删除文件,如何删除文件夹呢?

(will not be published)
*