0

저는 아직 Powershell의 초보자이지만, 할 수있는 모든 일을 배우고 연구하는 것을 좋아합니다.여러 서버의 서비스 계산하기

그래서, 나는 datagridview 테이블에 출력 할 스크립트를 만들려고합니다. 필자는 서버 목록에 입력 할 수있는 여러 줄의 텍스트 상자가있는 간단한 양식을 만들었고 실제로 각 서비스에 대한 각 서버를 쿼리하고 해당 정보를 해당 서버로 출력하기 위해 내 기능을 호출하는 간단한 "확인"단추 만 만들었습니다. 그 아래에있는 datagridview.

그 부분은 내가 만들 정도로 쉬웠습니다.

  • 쿼리 각 서버와, 나는 그것이 열에서 서비스 이름을 표시 할 DataGridView에에
  • 해당 서버의 모든 서비스 목록을 당겨 : 내 것은 내가 그 다음을 "하고 싶은이다 1, 2 열의 해당 서비스를 가지고있는 서버의 수를 확인하십시오.

희망이 있습니다. 이후 코드를 올바르게 작성하지 못해서 제대로 작성하지 못했습니다! 전체 목록을 생성하고 루프 및 카운트 유형을 수행하지만 확실하지는 않습니다.

이 문제에 도움을 주셔서 감사합니다. 인터넷 검색 및 미친 듯이 읽기. 검색 기준을 수정하지 않거나 단지 나를 위해 클릭하지 않는 것이 있습니다.

업데이트 - 현재 스크립트에 추가 나는이 :

이미 나는 우리에게 당신이 찾고있는 데이터의 그룹을 집중하기 위하여려고하고이 기능의 GUI 부분을 가지고 있기 때문에
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

$xForm = 800 
$yForm = 800 

$SVCForm = New-Object System.Windows.Forms.Form 
$SVCForm.Text = "Automatic Services Query" 
$SVCForm.Size = New-Object System.Drawing.Size($xForm,$yForm) 
$SVCForm.FormBorderStyle = "FixedSingle" 
$SVCForm.StartPosition = "CenterScreen" 
$SVCForm.ControlBox = $true 
$SVCForm.KeyPreview = $True 
$SVCForm.ShowIcon = $false 
$SVCForm.MinimizeBox = $True 
$SVCForm.MaximizeBox = $false 

$CancelButton = New-Object System.Windows.Forms.Button 
$CancelButton.Location = New-Object System.Drawing.Size(365,720) 
$CancelButton.Size = New-Object System.Drawing.Size(75,23) 
$CancelButton.Text = "Cancel" 
$CancelButton.Add_Click({$x=$CancelButton.Text;$SVCForm.Close()}) 
$SVCForm.Controls.Add($CancelButton) 

$ServerListGroup = New-Object System.Windows.Forms.GroupBox 
$ServerListGroup.Location = New-Object System.Drawing.Size(5,10) 
$ServerListGroup.size = New-Object System.Drawing.Size(780,300) 
$ServerListGroup.text = "Enter list of servers you want to check:" 
$SVCForm.Controls.Add($ServerListGroup) 

$ServerList = New-object System.Windows.Forms.TextBox 
$ServerList.Location = New-object System.Drawing.Size(5,25) 
$ServerList.Size = New-Object System.Drawing.Size(280,270) 
$ServerList.Multiline = $True 
$ServerList.ScrollBars = "Vertical" 
#$ServerList.add_TextChanged({ONValButton}) 
$ServerListGroup.Controls.Add($ServerList) 

$SVCButton = New-Object System.Windows.Forms.Button 
$SVCButton.Location = New-Object System.Drawing.Size(505,140) 
$SVCButton.Size = New-Object System.Drawing.Size(180,22) 
$SVCButton.Text = "SVC Check" 
$SVCButton.Enabled = $True 
$SVCButton.Add_Click({SvcCheckCount}) 
$ServerListGroup.Controls.Add($SVCButton) 


$SvcListGroup = New-Object System.Windows.Forms.GroupBox 
$SvcListGroup.Location = New-Object System.Drawing.Size(5,330) 
$SvcListGroup.size = New-Object System.Drawing.Size(780,380) 
$SvcListGroup.text = "Automatic Running/Not-Running Services are listed below:" 
$SVCForm.Controls.Add($SvcListGroup) 

#$SvcList = New-object System.Windows.Forms.TextBox 
#$SvcList.Location = New-object System.Drawing.Size(5,25) 
#$SvcList.Size = New-Object System.Drawing.Size(765,350) 
#$SvcList.Multiline = $True 
#$SvcList.ScrollBars = "Vertical" 
#$SvcList.Readonly= $True 
#$SvcListGroup.Controls.Add($SvcList) 

$SvcGrid = New-Object System.Windows.Forms.DataGridView 
$SvcGrid.Location = New-Object System.Drawing.Size(5,15) 
$SvcGrid.Size = New-Object System.Drawing.Size(760,360) 
$SvcGrid.ColumnHeadersBorderStyle = [System.Windows.Forms.DataGridViewHeaderBorderStyle]::Single 
$SvcGrid.CellBorderStyle = [System.Windows.Forms.DataGridViewCellBorderStyle]::Single 
$SvcGrid.ColumnHeadersHeightSizeMode = [System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode]::DisableResizing 
$SvcGrid.GridColor = [System.Drawing.Color]::Black 
$SvcGrid.RowHeadersVisible = $false 
$SvcGrid.AllowUserToAddRows = $false 
$SvcGrid.AllowUserToResizeColumns = $False 
$SvcGrid.AllowUserToResizeRows = $false 
$SvcGrid.ColumnHeadersHeight = 23 
$SvcGrid.SelectionMode = [System.Windows.Forms.DataGridViewSelectionMode]::FullRowSelect 
$Scroll = New-Object System.Windows.Forms.VScrollBar 
$Scroll.Dock = [System.Windows.Forms.DockStyle]::Right 
$Scroll.width = 18 
$Scroll.isAccessible = $false 
$SvcGrid.Controls.Add($Scroll)     
$SvcGrid.Columns.Add("Name","Service Name") > $null 
$SvcGrid.Columns["Name"].Width = 200 
$SvcGrid.Columns["Name"].HeaderCell.Style.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
$SvcGrid.Columns["Name"].DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
$SvcGrid.Columns["Name"].ReadOnly = $False 
$SvcGrid.Columns.Add("StartMode", "Start Mode") > $null 
$SvcGrid.Columns["StartMode"].Width = 180 
$SvcGrid.Columns["StartMode"].HeaderCell.Style.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
$SvcGrid.Columns["StartMode"].DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleLeft 
$SvcGrid.Columns["StartMode"].ReadOnly = $False 
$SvcGrid.Columns.Add("Running","Running") > $null 
$SvcGrid.Columns["Running"].Width = 180 
$SvcGrid.Columns["Running"].HeaderCell.Style.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter 
$SvcGrid.Columns["Running"].DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter 
$SvcGrid.Columns["Running"].ReadOnly = $true 
$SvcGrid.Columns.Add("NotRunng","Not Running")>$null 
$SvcGrid.Columns["NotRunng"].Width = 180 
$SvcGrid.Columns["NotRunng"].HeaderCell.Style.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter 
$SvcGrid.Columns["NotRunng"].DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleCenter 
$SvcGrid.Columns["NotRunng"].ReadOnly = $true 
$SvcListGroup.Controls.Add($SvcGrid) 




Function SvcCheckCount 
{ 
    $SvcGrid.Rows.Clear() 
    $Servername = $ServerList.Text.Split("`n")|%{$_.trim()} 

    foreach($Server in $Servername) 
      { 
      $Server = $Server.ToUpper() 
       $svctest = Get-WmiObject Win32_Service | Where-Object {$_.StartMode -eq 'Auto'} | Select-Object Name, Startmode, State 

       Foreach ($svc in $svctest) 
       { 
       $name = $svc.Name 
       $startmode = $svc.StartMode 
       $state = $svc.State 

       If($state-eq"Running"){$SvcGrid.Rows.add($name,$startmode,$state)} 
       If($state-eq"Stopped"){$SvcGrid.Rows.add($name,$startmode,$null,$state)} 
       } 

       } 



} 




$SVCForm.Topmost = $True 

$SVCForm.Add_Shown({$SVCForm.Activate()}) 
[void] $SVCForm.ShowDialog() 
+0

당신이 몇 가지를 제공 할 수 있습니다 암호? 당신이 무엇을 요구하고 있는지 명확하지 않습니다. 언급 한 모든 행동에 대해 여러 서버에서 서비스를 계산하거나 스크립트를 작성하는 데 문제가 있습니까? 두 번째 사례가 사실이라면 특정 질문에 다시 질문하고 시도한 코드를 표시하는 것이 좋습니다. –

+0

내가 갖고있는 스크립트로 내 게시물을 업데이트했습니다. 텍스트 상자에 입력 한 서버의 모든 서비스를 가져 와서 이름, 시작 모드 및 실행 또는 중지를 격자보기로 표시합니다. 이름순으로 정렬 할 수 있으며 각 서버에 대한 중복 서비스 이름이있는 것을 볼 수 있습니다. 내가 계산하기를 원하고 얼마나 많은 서버가 실행 중인지 (텍스트 상자에 int를 입력 한 것에서) 행 옆에 하나의 행과 개수로 발견되는 각 서비스 만 표시합니다. – LTrig

답변

1

. 이 부분에 들어가서 내가 모호한 이유는 if 진술이 필요한 이유이지만 필요한 경우 작업 할 수 있습니다. 다음은 당신의 foreach 루프 대신

$services = @() 
foreach($Server in $Servername){ 
    $Server = $Server.ToUpper() 
    $services += Get-WmiObject Win32_Service -ComputerName $Server -Filter 'StartMode="Auto"' | 
      Select-Object Name, Startmode, State | 
      Add-Member -MemberType NoteProperty -Value $Server -Name "Server" -PassThru 
} 
$services | Group-Object Name | ForEach-Object{ 
    $SvcGrid.Rows.add($_.Name,$_.Count) 
} 

첫 번째 일이 될하기위한 것입니다 : 당신은 당신이에서 이것을 실행중인 때문에 모든 결과는 하나의 시스템에서했을 것이다 당신의 WMI 호출에 $server 변수를 사용하지 않았다. 또한 Where-Filter으로 옮겼으므로 원격 시스템에서 처리 속도가 빨라졌습니다.

이 정보를 모두 배열에 모으십시오 (나중에 유용하게 사용할 수 있도록 컴퓨터 이름을 추가하십시오). 그런 다음 그 결과를 사용하여 Group-Object을 사용하여 찾고있는 카운트를 얻으십시오. 다른 ForEach-Object으로 그리드의 결과를 얻을 수있는 파이프

사이드 노트 (내가 테스트하지 않았습니다.) : 당신은 그냥 그리드에서 정보를 원하는 경우 Out-GridView

$services | Group-Object Name | Select name,count | Out-GridView 
+0

당신, 선생님! 고마워.내가 변경 한 것만이 get-wmi-object에 있었는데, 자동으로 멈추고 멈추기 위해 이것으로 파이프했다 :'$ services + = Get-WmiObject Win32_Service -ComputerName $ Server | {$ _. StartMode-eq "Auto" - $ _. State-eq "Stopped"}'그러면 게시 한 파이프가 계속되었습니다. – LTrig

+0

죄송합니다.'Where'를 제거하고'-filter'를 넣었습니다. 하나 이상의 필터를 추가하는 방법이 있습니까? – LTrig

+0

@L 필터를 다음과 같이 바꿀 수 있습니다 :'-Filter 'StartMode = "Auto"and State = "Stopped" – Matt