開(kāi)始
引用Windows PowerShell官方的說(shuō)明,Windows PowerShell 是專(zhuān)為系統管理員設計的新 Windows 命令行 shell。Windows PowerShell 包括交互式提示和腳本環(huán)境,兩者既可以獨立使用也可以組合使用。在我學(xué)習PowerShell過(guò)程中,發(fā)覺(jué)學(xué)習PowerShell的門(mén)檻不高,學(xué)起來(lái)不費勁,要是有DOTNET或其它編程語(yǔ)言基礎,那么感覺(jué)就更容易了。因為,PowerShell最基本的功能命令就是cmdlet(command-let),cmdlet標準格式是“動(dòng)詞-名詞”,如.Get-Help ,Get-Host,New-Service等。這讓人感覺(jué)很順口,不會(huì )花太多的時(shí)間去記住復雜的命令。下面,從一個(gè)實(shí)際的例子來(lái)描述PowerShell的應用。下面的例子,你將了解到命令:
前不久,有寫(xiě)過(guò)一篇《通過(guò)批處理腳本啟動(dòng)/停止SQL Server服務(wù)》,今天寫(xiě)出一篇通過(guò)PowerShell腳本實(shí)現相同的功能,而且使用比批處理腳本更為方便。通過(guò)PowerShell腳本實(shí)現,最大的優(yōu)點(diǎn)是,針對控制網(wǎng)絡(luò )電腦上的SQL Server服務(wù),沒(méi)必要通過(guò)遠端桌面連線(xiàn)工具,就可以實(shí)現。
先製作一個(gè)CSV格式文件『SQLSeverList.csv』,描述各個(gè)PC的SQL Server服務(wù)內容,數據項要求包含:PC ,ServerNr ,SQLServer, Agent ,FullTextSearch
『SQLSeverList.csv』存儲文件內容如下:
#SQL Server服務(wù)列表,本機使用"."來(lái)描述
PC,ServerNr,SQLServer,Agent,FullTextSearch
VM162,1,MSSQL$SQL2005DE1,SQLAgent$SQL2005DE1,msftesql$SQL2005DE1
VM162,2,MSSQL$SQL2005DE2,SQLAgent$SQL2005DE2,msftesql$SQL2005DE2
… …
PC20,1,MSSQL$SQL01,SQLAgent$SQL01,msftesql$SQL01
PC20,2,MSSQL$SQL02,SQLAgent$SQL02,msftesql$SQL02
… …
.,2,MSSQL$SQL2005DE2,SQLAgent$SQL2005DE2,msftesql$SQL2005DE2
.,3,MSSQL$SQL2005DE3,SQLAgent$SQL2005DE3,msftesql$SQL2005DE3
.,4,MSSQL$TEST,SQLAgent$TEST,msftesql$TEST
通過(guò)這個(gè)『SQLSeverList.csv』文件列表就可以找到對應的管理SQL Server服務(wù)。接下來(lái)通過(guò)PowerShell腳本,從文件『SQLSeverList.csv』篩選出要啟動(dòng)的SQL Server服務(wù)。再通過(guò)PowerShell中的命令 Get-WmiObject -Class Win32_Service 獲取服務(wù)對象,然後調用服務(wù)對象Win32_Service中的方法StartService() 、 StopService() 啟動(dòng)或停止服務(wù)。
如果是連接遠程PC,可以?huà)裼妙?lèi)似命令:
Get-WmiObject -Class Win32_Service –ComputerName <string[]> – Credential <PSCredential>
完整代碼:
#===============配置部份===========================
$User='HQ\Andy';
$CsvFile='E:\Stop&StartSQLServer\SQLSeverList.csv'
#==============可輸入部份(開(kāi)始)====================
$PC="VM162" #本機使用"."來(lái)描述,非本機使用電腦名稱(chēng)
$ServerNr=4 #SQL Server實(shí)例編號,來(lái)源于SQLSeverList.csv文件
$ActionType=0 # 1: 開(kāi)啟服務(wù) ,0: 停止服務(wù)
#==============可輸入部份(結束)====================
<#
“===可控制的服務(wù)列表: ”
Import-Csv -Path $CsvFile | Format-Table -AutoSize -Wrap
#>
try
{
$ServiceStr=Import-Csv -Path $CsvFile | Where-Object -FilterScript {($_.PC -eq $PC) -And ($_.ServerNr -eq $ServerNr)}
if ($PC -ne ".") #本機
{
$Credential_Login=Get-Credential -Credential $User
$Service_Agent=Get-WmiObject -Class Win32_Service -ComputerName $PC -Credential $Credential_Login | Where-Object -FilterScript {$_.Name -eq $ServiceStr.Agent}
$Service_SQLServer=Get-WmiObject -Class Win32_Service -ComputerName $PC -Credential $Credential_Login | Where-Object -FilterScript {$_.Name -eq $ServiceStr.SQLServer}
$Service_FullTextSearch=Get-WmiObject -Class Win32_Service -ComputerName $PC -Credential $Credential_Login | Where-Object -FilterScript {$_.Name -eq $ServiceStr.FullTextSearch}
}
Else #網(wǎng)絡(luò )
{
$Service_Agent=Get-WmiObject -Class Win32_Service | Where-Object -FilterScript {$_.Name -eq $ServiceStr.Agent}
$Service_SQLServer=Get-WmiObject -Class Win32_Service | Where-Object -FilterScript {$_.Name -eq $ServiceStr.SQLServer}
$Service_FullTextSearch=Get-WmiObject -Class Win32_Service | Where-Object -FilterScript {$_.Name -eq $ServiceStr.FullTextSearch}
}
$Running="Running"
$Stopped="Stopped"
If ($ActionType -eq 1) #Start Service
{
if ($Service_SQLServer.State -eq $Running)
{$Service_SQLServer.Name +" 正在運行"}
Else
{$Result=$Service_SQLServer.StartService()}
if ($Service_Agent.State -eq $Running)
{$Service_Agent.Name +" 正在運行"}
Else
{$Result=$Service_Agent.StartService()}
if ($Service_FullTextSearch.State -eq $Running)
{$Service_FullTextSearch.Name +" 正在運行"}
Else
{$Result=$Service_FullTextSearch.StartService()}
}
Else #Stop Service
{
if ($Service_FullTextSearch.State -eq $Stopped)
{$Service_FullTextSearch.Name +" 已停止."}
Else
{$Result=$Service_FullTextSearch.StopService()}
if ($Service_Agent.State -eq $Stopped)
{$Service_Agent.Name +" 已停止."}
Else
{$Result=$Service_Agent.StopService()}
if ($Service_SQLServer.State -eq $Stopped)
{$Service_SQLServer.Name +" 已停止."}
Else
{$Result=$Service_SQLServer.StopService()}
}
"命令處理OK!"
}
Catch
{
Write-Warning "執行腳本過(guò)程發(fā)生錯誤"
Write-Error $_ #輸出當前錯誤內容
}
演示:
現在要啟動(dòng)遠程PC的SQL Server實(shí)例『VM\SQL2005DE4』,包含『VM\SQL2005DE4』的3個(gè)服務(wù):
| MSSQL$SQL2005DE4 | SQLAgent$SQL2005DE4 | msftesql$SQL2005DE4 |
$User 這裡使用的是與帳戶(hù)”HQ\Andy”,而且這個(gè)帳戶(hù)具有管理電腦VM162的權限功能。
點(diǎn)擊Powershell_ise介面上的三角形執行腳本按鈕。
這裡會(huì )彈出一個(gè)Windows登錄認證窗口,輸入我們的帳號密碼,點(diǎn)擊確認按鈕繼續。
從狀態(tài)欄就會(huì )看到正在執行的信息提示,根據實(shí)際情況運行時(shí)間長(cháng)短的不同,最後我們會(huì )收到是否處理完成的提示:
如果服務(wù)已經(jīng)在運行,我們就看到服務(wù)正在運行的信息提示:
小結
PowerShell腳本代碼,看起來(lái)是很容易的,而且功能還不錯,它是建立在 .NET (CLR) 和 .NET Framework 上,而且可接受和傳回 .NET 對象。在安裝SQL Server 2008中就附帶有PowerShell 1.0。目前最新版本是PowerShell 2.0.帶有Powershell_ise工具,使用起來(lái)更便捷。如果你經(jīng)常涉及到管理Windows系統或SQL Server 服務(wù)器,那麼學(xué)習瞭解PowerShell是不錯的選擇。
聯(lián)系客服