2011-08-18 2 views
1

내가 몇 가지 설정을 수행 내 첫 PowerShell 스크립트를 구현PowerShell을 : 다시 시작 서비스에 의해 실행 가능한 이름

모든 레지스트리 키를 설정 한 다음에 서비스를 다시 시작하는 요구를 종료합니다. 문제는 내가 실행 파일의 이름 만 갖고 있지만 서비스 이름은 없다는 것입니다. 재시작 - 서비스는 서비스의 이름으로 만 작동 할 수 있습니다. 인터넷 검색 (잘 빙빙도) 주위에 많은 결과를주지 않았다.

실행 파일 이름으로 서비스를 다시 시작하는 방법이 있는지 궁금합니다.

실행 가능한 이름으로 프로세스를 가져올 수 있지만 프로세스를 종료하고 다시 시작하는 것은 좋은 선택이 아닙니다. 서비스 시작/중지 기능이 호출되지 않고 제대로 작동하지 않을 수 있기 때문입니다.

감사합니다.

답변

4

당신은 WMI를 사용하려고 같은 것을 수행 할 수 있습니다 사용하여이 WMI

(gwmi win32_service | ?{$_.pathname -match "\\executable.exe "}) | Restart-Service 
+0

할 수 있습니다하지 다시 시작 서비스 cmdlet으로 파이프 WMI 서비스 인스턴스. 개체의 형식이 다릅니다. –

+1

@Shay : 파이핑을 시도해보십시오. 훌륭한 일을해라! –

+0

@Shay - 실망. 그것을 밖으로 시도하십시오. – manojlds

0

당신은 할 수 있습니다 :

$process = Get-Process sqlservr| select -ExpandProperty Id 

Get-WmiObject win32_Service| 
    where {$process -contains $_.ProcessId}| 
    foreach {Restart-Service $_.Name} 

편집 : 서비스를 다시 시작하는 변경된 스크립트, 단지 그것을 멈추지을 .

1
Get-WmiObject -Class Win32_Service -Filter "PathName LIKE '%PartOfTheName%'" -ComputerName PC1 | Foreach-Object{ 
    $_.StopService() 
    $_.StartService() 
} 
+0

어떻게 작동하나요? – manojlds

+0

오, PathName 대신 이름을 사용했습니다. 캐치를 주셔서 감사합니다! –

+0

같은 .exe를 가진 서비스가 여러 개인 경우 어떻게 될까요? sqlservr.exe를 사용하는 여러 서비스가 있습니다. 또한 "AnotherExename.exe"를 사용하는 서비스가있는 경우 ("%"와일드 카드가 일치하게됩니다); 있을 법하지는 않지만 가능합니다. – Rynant

0
#set by logic to determine if the service will restart or not 
$global:ServerWillRestart=$true 

#can be found using the name column of Get-services cmdlet 
$serviceName="Set name of the service" 
if($global:ServerWillRestart){ 
    $service =Get-Service | where{ $_.Name -eq $serviceName} 
do{ 
    Write-output "The service $ServiceName will is being stopped" 
    Stop-Service $service 
    Start-Sleep -s 2 
} 
while($service.WaitForStatus("Stopped")) 

do{ 
    Write-Output "The service $ServiceName will is being started" 
    Start-Service $service 
    Start-Sleep -s 2 
} 
while($service.WaitForStatus("Running"))