Windows Sysinternals 工具自动更新脚本

Windows Sysinternals 内包含了很多微软提供的实用工具,经常用到的比如 Process ExplorerProcess MonitorTcpViewAutorunsDbgView 等等,因为这些工具各司其职,大多是分开的单独的 exe,如果想更新他们,我自己平时都是去 Windows Sysinternals 直接下载覆盖更新,每个文件都去看看版本号对不对,这样很麻烦。后面在网络上搜索到了一个 PowerShell 的脚本,直接运行脚本指定好目录就可以自动下载最新的工具了,非常实用,这里推荐给大家。

运行后的效果

2016-06-06_142518

PowerShell 代码

function Update-SysinternalsHTTP ($ToolsLocalDir = "c:\temp\sys")  
{ 
    if (Test-Path $ToolsLocalDir){ 
        cd $ToolsLocalDir
        $DebugPreference = "SilentlyContinue"
        $wc = new-object System.Net.WebClient
        $userAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2;)"
        $wc.Headers.Add("user-agent", $userAgent)
        $ToolsUrl = "http://live.sysinternals.com/tools"
        $toolsBlock="<pre>.*</pre>"
        $WebPageCulture = New-Object System.Globalization.CultureInfo("en-us")
        $Tools = @{}
        $ToolsPage = $wc.DownloadString($ToolsUrl)
        $matches=[string] $ToolsPage |select-string -pattern  "$ToolsBlock" -AllMatches
        foreach($match in $matches.Matches) {   
            $txt = ( ($match.Value  -replace "</A><br>", "`r`n") -replace  "<[^>]*?>","")
            foreach($lines in $txt.Split("`r`n")){
                $line=$lines|select-string  -NotMatch -Pattern "To Parent|^$|&lt;dir&gt;"
                if ($line -ne $null){
                    $date=(([string]$line).substring(0,38)).trimstart(" ") -replace "  "," "
                    $file=([string]$line).substring(52,(([string]$line).length-52))
                    $Tools["$file"]= [datetime]::ParseExact($date,"f",$WebPageCulture)
                }
            }
        }
        $Tools.keys|
        ForEach-Object {
            $NeedUpdate=$false
            if (Test-Path $_)
            {
                $SubtractSeconds = New-Object System.TimeSpan 0, 0, 0, ((dir $_).lastWriteTime).second, 0
                $LocalFileDate= ( (dir $_).lastWriteTime ).Subtract( $SubtractSeconds )
                $needupdate=(($tools[$_]).touniversaltime() -lt $LocalFileDate.touniversaltime())
            } else {$NeedUpdate=$true}
            if ( $NeedUpdate ) 
            {
                Try {
                        $wc.DownloadFile("$ToolsUrl/$_","$ToolsLocalDir\$_" )
                        $f=dir "$ToolsLocalDir\$_"
                        $f.lastWriteTime=($tools[$_])
                        "Updated $_"
                    }
                catch { Write-debug "发生错误: $_" }
            } 
        } 
    }
}
cls
"更新开始..."
Update-Sysinternalshttp -ToolsLocalDir "D:\Tools"
"更新结束"

将脚本复制下来保存为 .ps1 后缀的文件,使用 PowerShell 运行即可。注意代码最后的路径 D:\Tools 如果你需要修改为其他路径请在这里修改。代码实际就是去 http://live.sysinternals.com/tools 对比文件信息进行更新。有兴趣的可以自己做个脚本来搞定!

发表评论