Windows PowerShell:按可执行文件名称重新启动服务

Windows PowerShell:按可执行文件名称重新启动服务,windows,scripting,powershell,windows-services,Windows,Scripting,Powershell,Windows Services,全部 我实现了我的第一个PowerShell脚本,它进行了一些设置,设置了注册表项,然后需要重新启动服务。问题是我只有可执行文件的名称,但没有服务名称。重新启动服务只能使用服务的名称。谷歌搜索也没有给我太多的结果 我想知道是否有办法通过可执行文件名重新启动服务 我知道我可以通过可执行文件名获取进程,但仅仅终止进程并再次启动它并不是一个好的选择,因为服务启动/停止函数没有被调用,它可能无法正常工作 谢谢。您可以尝试使用wmi并执行以下操作: (gwmi win32_service | ?{$_.p

全部

我实现了我的第一个PowerShell脚本,它进行了一些设置,设置了注册表项,然后需要重新启动服务。问题是我只有可执行文件的名称,但没有服务名称。重新启动服务只能使用服务的名称。谷歌搜索也没有给我太多的结果

我想知道是否有办法通过可执行文件名重新启动服务

我知道我可以通过可执行文件名获取进程,但仅仅终止进程并再次启动它并不是一个好的选择,因为服务启动/停止函数没有被调用,它可能无法正常工作


谢谢。

您可以尝试使用wmi并执行以下操作:

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

您可以尝试使用wmi并执行以下操作:

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

您可以使用WMI执行此操作:

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

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

编辑:更改脚本以重新启动服务,而不仅仅是停止服务。

您可以使用WMI执行此操作:

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

Get-WmiObject win32_Service| 
    where {$process -contains $_.ProcessId}|
    foreach {Restart-Service $_.Name}
Get-WmiObject -Class Win32_Service -Filter "PathName LIKE '%PartOfTheName%'" -ComputerName PC1 | Foreach-Object{
    $_.StopService()
    $_.StartService()   
}

编辑:已更改脚本以重新启动服务,而不仅仅是停止它。

您不能将WMI服务实例通过管道传输到restart service cmdlet。对象的类型不同。@Shay:试试管道。。干得好!我对@Shay的匹配解决方案的评论也适用于此解决方案。这将匹配可执行文件:MyExecutable.exe、AnotherExecutable.exe executable.exec.exe等\\executable.exe\b会更好,但是\executable.exe.new.exe也会匹配它,我知道,不太可能。@Rynant-OP可能知道可执行文件及其路径,甚至参数等。OP可以指定整个。而且您似乎不知道svchost.exe是如何工作的。服务不使用该路径作为可执行路径。我知道svchost.exe是什么,并且您不会通过匹配svchost.exe进程来重新启动服务。有些服务将其用作可执行路径。如果运行:gwmi win32_service-筛选路径名,如“%svchost.exe%”,我将获得119个服务。我的观点是$chost.exe%将与svchost.exe匹配。您不能将WMI服务实例通过管道传输到Restart service cmdlet。对象的类型不同。@Shay:试试管道。。干得好!我对@Shay的匹配解决方案的评论也适用于此解决方案。这将匹配可执行文件:MyExecutable.exe、AnotherExecutable.exe executable.exec.exe等\\executable.exe\b会更好,但是\executable.exe.new.exe也会匹配它,我知道,不太可能。@Rynant-OP可能知道可执行文件及其路径,甚至参数等。OP可以指定整个。而且您似乎不知道svchost.exe是如何工作的。服务不使用该路径作为可执行路径。我知道svchost.exe是什么,并且您不会通过匹配svchost.exe进程来重新启动服务。有些服务将其用作可执行路径。如果运行:gwmi win32_service-筛选路径名,如“%svchost.exe%”,我将获得119个服务。我的观点是$chost.exe%将与svchost.exe匹配如果有多个服务使用相同的.exe怎么办。我有多个使用sqlservr.exe的服务。另外,如果有一个服务使用AnotherExename.exe,那么%通配符将使其匹配;不太可能,但可能。您可以扩展代码以处理多个对象,我马上更新它。如果要匹配服务名称的某些部分,请将字符串括在%.中。我不是说匹配应该不那么严格,而是更严格。如果有一个名为chost.exe的服务怎么办?'%chost.exe'也将与'svchost.exe'匹配。此外,PathName参数还包括aguments,例如“msiexec.exe/V”。%\“chost.exe%”会更好,但不是100%万无一失,因为它会匹配“chost.exec.exe%”我知道我很痛苦,但我只是尝试处理所有情况:-P@Ryhant,我可以使用以下命令提取映像名:Get WmiObject-Class Win32_Service | Foreach对象{Split Path-Leaf$|.PathName-Split'\s\-|/'[0].Trim'}。它也适用于您,我们可以编写更好的解决方案。如果有多个服务使用相同的.exe会怎么样。我有多个使用sqlservr.exe的服务。另外,如果有一个服务使用AnotherExename.exe,那么%通配符将使其匹配;不太可能,但可能。您可以扩展代码以处理多个对象,我马上更新它。如果要匹配服务名称的某些部分,请将字符串括在%.中。我不是说匹配应该不那么严格,而是更严格。如果有一个名为chost.exe的服务怎么办?'%chost.exe'也将与'svchost.exe'匹配。此外,PathName参数还包括aguments,例如“msiexec.exe/V”。%\“chost.exe%”会更好,但不是100%万无一失,因为它会匹配“chost.exec.exe%”我知道我很痛苦,但我只是尝试处理所有情况:-P@Ryhant,我可以使用以下命令提取映像名:Get WmiObject-Class Win32_Service | Foreach对象{Split Path-Leaf$|.PathName-Split'\s\-|/'[0].Trim'}。它也适用于您,我们可以编写更好的解决方案。
Get-WmiObject -Class Win32_Service -Filter "PathName LIKE '%PartOfTheName%'" -ComputerName PC1 | Foreach-Object{
    $_.StopService()
    $_.StartService()   
}