高層概念
這個PowerShell腳本將在眾多SQL服務器之間共享。如果服務器的名稱在JSON檔案中,那么它將使用JSON檔案中的SQL服務名稱運行類似于Set-Service -Name SQLEngine_InstanceA -StartType Manual的內容,并將其starttype改為 "禁用"、"按需"、"手動 "或 "自動"。然后,它將啟動JSON檔案中列出的那些服務。
目標
JSON 檔案具有特定的格式,腳本需要根據 JSON 檔案中指定的引數采取行動。該腳本將檢查執行服務器的名稱是否存在于JSON檔案中,然后根據JSON檔案的引數更新服務的起始型別。它還將檢查JSON檔案中的每個引數,以了解它是否應該對其采取行動。
我需要完成的基本任務:
我需要完成的基本任務
- 服務器定期(每15分鐘)運行這個PowerShell腳本,以了解SQL服務是否會在該視窗內被關閉進行維護。
- 腳本針對一個JSON檔案
StartServices.json運行,該檔案包含。- serverName
- startAt
- 服務
- 服務名稱
。
- 命令
- 啟動模式 。
- 如果服務器名稱與
$env:COMPUTERNAME相匹配,并且startAt >= $Current_Time,則繼續進行下一步。 - 它應該遍歷每個與計算機名稱匹配的服務,特別是在指定的 "順序 "中,并運行
Start-Service -Name $ServiceName -StartType $StartMode。順序很重要,因為我們要求在其他服務之前啟動/停止某些服務。
我卡在了第4步。下面是我用來訪問引數的腳本的一個簡化例子。我無法干凈地參考服務部分,因為PowerShell在通過ConvertFrom-JSON攝取時在該層創建了一個陣列。陣列的問題是我想避免硬編碼索引,因為可能只有3個服務需要采取行動,也可能有超過5個。
我希望通過類似 $content.Server_Name["ServerABC"].Services 或類似的基于物件的方法來訪問這個元素。
示例PowerShell腳本
# Declare變數
$InputFile = 'C: empStartServices.json'/span>
$ParsedRaw = Get-Content - Raw -Path $InputFile |ConvertFrom-Json
$vPSObject = $ParsedRaw
$serverName = $vPSObject.serverName
$services = $vPSObject.services #這只是列出了所有服務名稱,順序,和 startMode
檢查是否JSON檔案存在。
如果(Test-Path -Path $InputFile -PathType Leaf) {
Write-Host "JSON File Exists" (JSON檔案存在)。
# Check if Server name is in list
如果($serverName -包含 $env:COMPUTERNAME) {
$currentServerIndex = $serverName.indexOf($env:COMPUTERNAME)
Write-Host "$env:COMPUTERNAME的當前索引是$currentServerIndex"
# 檢查 if StartAt time in JSON is after the current time
$DateTimeNow = Get-Date
$DateTimeEvent = [DateTime]::ParseExact($vPSObject.startAt[$currentServerIndex], 'yyy-MM-dd HH:mm:ss', $null) # 這個格式需要 來 匹配 JSON time格式化
如果($DateTimeEvent -gt $DateTimeNow.DateTime) {
Write-Host "this will run since startAt is in the future"
# Area I'm stuck - Getting Service Start Mode & Status without using Indexes
$StartTypeEngine = Get-Service -Name $vPSObject.serverName[$currentServerIndex].services.serviceName[0] | Select -Property starttype -ExpandProperty starttype
$StartTypeBrowser = Get-Service -Name $vPSObject.serverName[$currentServerIndex].services.serviceName[1] | Select -Property starttype -ExpandProperty starttype
$StartTypeAgent = Get-Service -Name $vPSObject.serverName[$currentServerIndex].services.serviceName[2] | Select -Property starttype -ExpandProperty starttype
# 如果變數更加動態,剩下的代碼就會像這樣簡單。
ForEach ($service in $services){
Set-Service -Name $service.serviceName -StartType $service.StartupMode
Start-Service -Name $service.serviceName
Write-Host "服務$service.serviceName已經啟動,它的啟動模式是 設定 到 $service.StartMode"
}
}
}
}
示例 JSON
[
{
"serverName": "Main_SQL_Server",
"startAt" : "2021-10-14 10:00:00",
"服務"。[
{
"serviceName": "MSSQL$Cluster",
"順序": 1。
"startupMode": "手動"
},
{
"serviceName": "MsDtsServer",
"順序": 2,
"startupMode": "手動"
},
{
"serviceName": "SQLBrowser$Cluster",
"順序": 3,
"startupMode": "手動"
},
{
"serviceName": "SQLAgent$Cluster",
"順序": 4,
"startupMode": "自動"
}
]
},
{
"serverName": "Other_SQL_Server",
"startAt" : "2021-10-14 11:00:00",
"服務"。[
{
"serviceName": "MSSQL$Backup",
"順序": 1,
"startupMode": "手動"
},
{
"serviceName": "MsDtsServer",
"順序": 2,
"startupMode": "自動"
},
{
"serviceName": "SQLBrowser$Backup",
"順序": 3,
"startupMode": "自動"
},
{
"serviceName": "SQLAgent$Backup",
"順序": 4,
"startupMode": "手動"
}
]
}
]
uj5u.com熱心網友回復:
這并不難! 所以你為每臺服務器準備了一個服務陣列,對嗎?
{
"serverName": "Main_SQL_Server",
"startAt" : "2021-10-14 10:00:00",
"服務"。[
{
"serviceName": "MSSQL$Cluster",
"順序": 1。
"startupMode": "手動"
},
{
"serviceName": "MsDtsServer",
"順序": 2,
"startupMode": "手動"
},
{
"serviceName": "SQLBrowser$Cluster",
"順序": 3,
"startupMode": "手動"
},
{
"serviceName": "SQLAgent$Cluster",
"順序": 4,
"startupMode": "自動"
}
]
}
我們可以這樣加載:
我們可以這樣加載。
$js = get-content c: empstack.json
然后我們可以像這樣只選擇一個特定的服務器:
$server = $js | where serverName -eq Main_SQL_Server
然后你可以使用foreach回圈遍歷這些服務器。
forEach ($service in ($server.services | sort order)){
Set-Service -Name $service.ServiceName -StartupType $service.StartupMode
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/332304.html
標籤:
上一篇:如何隱藏/不隱藏密碼材料uI
