自己使用Powershell的目的是为了更方便的管理与SQL Server相关,所以就顺便发到SQL Server版本,希望对大家有所启发。Powershell 是微软开发的windows平台上的新脚本语言,目的在于实现类似于bash 等方便管理windows 系统的功能,为系统管理员带来更大的方便。在实际应用中自己也尝试着去学习和应用powershell,经过一段时间的摸索,发现其功能确实强大,能够在windows平台上灵活的管理文件系统、注册表、进程、服务、SQL Server、exchange等,而且容易上手,简化了很多管理的方式。一、Powershell的资源网上有很多Powershll的优秀资源,顺便跟大家分享下
1,微软的Powershll官方网站
http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx
要想了解一项新技术,最好的资源莫过于官方网站了,有一些非常好的入门资料,值得一看。2,powershell.com
http://powershell.com/cs/
这是idera公司维护的一个关于powershell的学习网站,里面有很多非常好的实践和问题解决方案,能够提供很好的启发。

3,simple-talk 网站

http://www.simple-talk.com/search/default.aspx?search=powershell
simple- talk是redgate维护的一个知识网站,里面网罗了很多数据库和其他技术的大师(如Joe Celko),是一个非常好的知识库。最早引起自己对Powershell兴趣的就是看了上面地址的一系列利用powershell管理SQL Server的文章。4,电子书
首推下述两本
1, 《Manning.Power.Shell.in.Practice.Jun.2010》 从书名也可以看出具有很强的实践性
2, 《OReilly.Windows.PowerShell.Cookbook.Oct.2007》OReilly出这种语言书也很具含金量不过都是英文版。二、注意事项Powershell目前已经发展到了V2 版本,在安装SQL Server 2008时,会自动安装V1,但有很大的功能限制,为了获得更好的功能,尽量考虑使用V2。下载地址为:
http://support.microsoft.com/kb/968929三、Powershell 和SQL Server在使用SQL Server 2008时,我们会发现自动安装了POWERSHELL。说明POWERSHELL已经和SQL Server进行了很好的融合,要通过powershell来管理SQL Server主要是通过直接操作SMO(SQL Server Mnagement Object)来实现。但平时应用的不多,所以未对其过多深入,有兴趣的朋友可以参考下联机丛书
四、自己的Powershell实践像我在管理SQL Server时,最经常遇到的需求是:
1,如何获得windows的事件查看器里的警告和错误信息,并发送警告,
2,如何获得SQL Server相关服务的运行状态,并发送警告;
3,如何获得SQL Server服务器的空间信息,并发送警告;
4,如何移动历史备份文件到新的目录,防止做磁带备份时产生冗余。当然,上述内容,通过SQL Server 编写T-SQL应该也能实现,但相对而言会复杂很多,而通过POWERSHELL的话,有些甚至只需要几行语句就可以了。1,如何获得windows的事件查看器里的警告和错误信息,并发送警告,# Created at 2010-08-23
# Created by obuntu
#
# 创建获取服务器错误和警告信息的函数
# 在POWERSHELL里,Get-EventLog还可以管理远程服务器,如果有多台服务器的话,会更方便管理
function get-sqlEventLog{
   #参数为服务器名,后续调用函数时,输入服务器名就可以 
Param(
        [String] $serverName
        )    # EntryType用来筛选错误和警告信息
 # APPLICATION指的是应用程序的信息,其他的还有 SYSTEM,SECURITY
 #利用get-date获取最近1个小时的错误和警告信息
 Get-EventLog Application -ComputerName $serverName  -EntryType 'Error','Warning' -After ((get-date).addhours(-1))  |Format-List  
 
}$headline=(Get-Date).toString() #写入时间
$headline_TIME="----------当前时间为"+$headline+"-----"
$headline_TIME|out-file "C:\ErrorLogInfo.txt"‘-----------------------Server01的日志内容-----------------------' |out-file "C:\ErrorLogInfo.txt" -Append
get-sqlEventLog '192.168.2.1' |Out-File "C:\ErrorLogInfo.txt" -Append‘-----------------------Server02的日志内容 -----------------------' |out-file "C:\ErrorLogInfo.txt" -Append
get-sqlEventLog '192.168.3.1' |Out-File "C:\ErrorLogInfo.txt" -Append#...可以按照上述方式获取更多台服务器的日志$errortext=Get-Content -Path "C:\ErrorLogInfo.txt"
if($errortext -match "Index")
{
    $message =New-Object System.Net.Mail.MailMessage -ArgumentList [email protected],[email protected],'系统错误和警告信息',' 有错误发生,请尽快排除!!'
    $attachment=New-Object System.Net.Mail.Attachment -ArgumentList 'C:\ErrorLogInfo.txt',‘Application/Octet’
    $message.Attachments.Add($attachment)
    $smtp=New-Object System.Net.Mail.SMTPClient -ArgumentList 192.168.4.1 #指定邮件服务器地址
    $smtp.send($message)
}2,如何获得SQL Server相关服务的运行状态,并发送警告;# Created at 2010-08-23
# Created by obuntu
# 在-match后面可以利用正则表达式来筛选自己想关注的服务状态
# 在-computername后面指定多台服务器
$message=Get-Service -computername 192.168.2.1,192.168.3.1,192.168.4.1 | Where-Object {$_.Name -match "\bmsdtc\b|\bmssqlserver\b|\bsqlwriter\b|\bmsdtsserver100\b|\bsqlserveragent\b"} `
|sort machinename|format-table -Property machinename,name,status,displayname -auto |Out-String
#如果有服务停止,立即发送邮件
if($message -match "stopped")
{
    $emailFrom = "[email protected]"
    $emailTo = "[email protected]"
    $subject = "服务停止警告"
    $body="有服务发生停止,请尽快处理!!"
    $body = $body+$message
    $smtpServer = "192.168.5.1"
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $smtp.Send($emailFrom, $emailTo, $subject, $body)
}3,如何获得SQL Server服务器的空间信息,并发送警告;#by obuntu
# 2010-8-23
 $message=Get-WmiObject win32_logicaldisk -computername `
 192.168.2.1,192.168.3.1,192.168.4.1 |Where-Object{$_.DriveType -eq 3} |Format-Table `
 -auto systemname,DeviceID,`
 @{label="FreeSpace (GB)";expression={"{0:F2}" -f ($_.FreeSpace/1024/1024/1024)}},`
 @{label="TotalSize (GB)";expression={"{0:F2}" -f ($_.Size/1024/1024/1024)}},`
 @{label="Note";expression={if((($_.FreeSpace/1024/1024/1024) -lt 5) {"此硬盘剩余空间小于5G,请及时释放!!"} else{}}} |out-string
 
 # 每天的8点和14点进行磁盘空间检查
 $h=(get-date).hour
 if(($h -eq 8) -or ($h -eq 16))
 {
    $emailFrom = "[email protected]"
    $emailTo = "[email protected]"
    $subject = "SQL Server服务磁盘空间检查"   
    $body = $message
    $smtpServer = "192.168.3.2"
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $smtp.Send($emailFrom, $emailTo, $subject, $body)
 }
 elseif($message -match "小于5G")
 {
    $emailFrom = "[email protected]"
    $emailTo = "[email protected]"
    $subject = "磁盘空间预警"
    $body="有磁盘空间小于5G,请尽快处理!!"
    $body = $body+$message
    $smtpServer = "192.168.3.2"
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $smtp.Send($emailFrom, $emailTo, $subject, $body)
 }
 
4,如何移动历史备份文件到新的目录,防止做磁带备份时产生冗余。#by obuntu
# 2010-8-23
#将F:\bk_test里的所有文件,包括目录,满足一定条件的移动到 F:\bk_test2下
$sourcePath="F:\bk_test"
$targetPath="F:\bk_test2"
$sourcePathD=$sourcePath+"\*"
$DateToCompare = (Get-date).AddDays(-7)
Copy-Item $sourcePathD $targetPath -Force
Get-ChildItem -Path $sourcePath -Recurse -include *.* |where-object {$_.lastwritetime –lt $DateToCompare}`
| Move-Item -Destination { Join-Path $targetPath $_.FullName.SubString(($
sourcePath).Length) } -Force
五、小结只是单纯介绍一些POWERSHELL的实际应用,对一些语法并未进行介绍,但如果想了解一个命令的话,有2种方式,如想要了解Copy -Item的用法,可以用Get-Help Copy-Item 和 Copy-Item | Get-Member 。上述脚本,可以使用任务计划运行,也可以通过SQL Server创建作业来运行,其实也包含了基本的监控雏形。

解决方案 »

  1.   

    Powershell的确有很多用途,微软的很多服务器端软件,都配备了相应的powershell脚本支持,以加强管理方面的灵活性。
      

  2.   

    powershell是以后管理微软应用的一个趋势。曾早学,以后你就是大湿
      

  3.   

    nice 精力有限,还未研究。
      

  4.   

    哇,Windows版的BASH啊,收藏起来,就是不知道哪一天才用得上
      

  5.   

    这个用过一段时间,系统管理员用的比较多点,基于.NET的。
    感觉一切都是模仿bash,模仿的也不太好。一般用用可以,windows和unix架构不同,shell在unix中是很重要的一部分,windows上power shell也就是管理wmi、注册表和系统组件,写写脚本而已。
      

  6.   


    确实如此,应该比起类似于perl,Python这样的脚本语言差多了。
    所以也未怎么对其深入。
      

  7.   

    我感觉学这个的价值远不如在Unix上学shell的价值。Powershell是微软针对系统管理员做的编程语言,动态又基于.NET,所以性能上仅仅说是凑合满足简单需要。仅仅是和系统组件结合的比较好而已。
    至于扩展性,可以用C#开发自己的cmdlet等等,不过扩展很有限.
    至于它的语法,仁者见仁智者见智了,我感觉远不如python,也没有精妙的语法糖, Function看上去很怪。
    这个东西要发展的路还远的很,注定非主流,喜欢玩玩可以,MCSD们可以做做系统维护。
      

  8.   


    shell在unix中是干嘛的。。
      

  9.   

    真的很强大,是安装server2008系统的必须条件,也打算学习
      

  10.   

    wa ..yi dian dou kan bu dong
      

  11.   

    类似于unix中的shell
    实现自动化管理
      

  12.   

    润乾报表4.0用户手册 CSDN 下载频道
      

  13.   

    up up every day .just for