2016-01-31 70 views
0

我正在構建一個腳本,我希望允許用戶輸入以採取操作。用戶輸入來執行操作

目前此工具可以檢查所有遠程服務器是否有任何自動停止的服務。我不希望腳本自動啓動它們。我想用戶輸入來啓動這些服務。

Write-Host "Checking for Stopped Services..." 

$stoppedServices = Invoke-Command $Servers { 
    Get-CimInstance Win32_Service -ComputerName $Servers -Filter "startmode = 'auto' AND state != 'running'" | 
     Sort state | select name, state 
} -Credential $Credential 

if ($stoppedServices -ne $null) { 
    Clear-host 
    $stoppedServices   
} else { 
    Clear-Host 
    Write-Host ("No stopped services found!") 
} 

所以用戶有能力看到停止的服務。我想從中做2件事。用選項寫出已停止的服務,是否要啓動這些已停止的服務?

使用該選項,然後退出或啓動服務。我想我可以通過另一個foreach循環來實現這一點,但永遠無法實現。

+0

你能比「但不能得到那個」更具體嗎?你收到任何錯誤?觀察到的行爲與預期的行爲? –

+0

對不起,它只是平坦的不起作用。我結束了FulBox1,Box2.domain.host。這就像在數學問題中展示工作。我完全從PowerShell開始,似乎無法找到我需要的任何地方 – JonnyBoy

+0

這聽起來像是兩個單獨的問題。首先,在自動模式下啓動所有已停止的服務之前,首先要求提供「確認」問題。然後你有一個完全不同的腳本來停止。請更具體一個問題,每個SO帖子。 –

回答

0

您可能希望使用Get-WmiObject而不是Get-CimInstance,在散列表中收集匹配的服務,並使用-PassThru選項將列表傳遞到Out-GridView。 gridview將僅返回用戶選擇的對象,您可以使用該對象調用散列表中的服務對象的StartService()方法。

$svc = @{} 
Get-WmiObject Win32_Service -Computer $Servers -Credential $Credential -Filter "startmode = 'auto' AND state != 'running'" | 
    ForEach-Object { $svc[$_.DisplayName] = $_ } 

$svc.Values | Select-Object SystemName, DisplayName, State | 
    Sort-Object State, SystemName, DisplayName | 
    Out-GridView -PassThru | 
    ForEach-Object { $svc[$_.DisplayName].StartService() } 
+0

雖然這看起來正是我所需要的,但一旦它達到For-each-object啓動數組爲空時。 索引操作失敗;數組索引評估爲null。 – JonnyBoy

+0

@JonnyBoy當我測試它時它工作正常。請提供證據。 '$ svc'的值和'Out-GridView -PassThru'返回的值是什麼? –

+0

PassThru顯示停止的服務。 一旦它通過那部分雖然我得到這個.. 索引操作失敗;數組索引評估爲null。 #################################### + ForEach-Object {$ svc [$ _。DisplayName ]} + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidOperation:(:) [],RuntimeException + FullyQualifiedErrorId:NullArrayIndex ####### ############################ 我拿出StartService(),因爲我現在不想啓動.. – JonnyBoy