我正在尝试编写PowerShell脚本以在远程系统上重新启动服务?是否可以基于脚本输出启动服务?例如,如果服务状态返回“已停止”状态,请执行以下伪代码...
if {service-status = Stopped | Get-Service -Name ServiceName | Start-Service}
这是我当前代码的示例,如果其中任何一个有意义的话:
# Display status of Sophos Services
$Computer1 = Read-Host -Prompt 'Enter the computer name to check Sophos Services'
Get-Service -DisplayName sop* -ComputerName $Computer1
# Service Stop
$Service1 = Read-Host -Prompt 'Enter the service needed to be restarted'
Echo "Stopping service"
Read-Host -Prompt "Press Enter to continue"
Get-Service -Name $Service1 -ComputerName $Computer1 | Stop-Service
# Service Stop
Echo "Starting service"
Read-Host -Prompt "Press Enter to continue"
Get-Service -Name $Service1 -ComputerName $Computer1 | Start-Service
最好使流程自动化一些。 希望这有道理。
感谢...
答案 0 :(得分:3)
您可以使用Restart-Service
通过带有Powershell Remoting(通过WinRM)的Invoke-Command
cmdlet来执行此操作。请注意,虽然您可以使用管道通过Get-Service
获取服务并将其通过管道传输到Stop-Service
,Start-Service
或Restart-Service
,但这并不是这里不是真的有必要,而且无论如何您都不能直接在远程服务器上调用它们:
$Computer1 = Read-Host -Prompt 'Enter the computer name to check Sophos Services'
$Service1 = Read-Host -Prompt 'Enter the service needed to be restarted'
Write-Output "Restarting service ${Service1} on ${Computer1}"
Read-Host -Prompt "Press Enter to continue"
# Restart the service on the remote computer
Invoke-Command -ComputerName $Computer1 -ArgumentList @{ Service1 = $Service1 } -ScriptBlock {
Restart-Service -Name $args.Service1 -Force
}
Invoke-Command
-ComputerName
-要在其上运行命令的计算机/服务器的名称。默认情况下,您的用户帐户必须位于要连接到的服务器上的Administrators
或Remote Management Users
组中。如有必要,可以使用-Credential
参数指定备用凭据。另外,您可以传入一系列计算机以一次运行相同的ScriptBlock
。
-ArgumentList
-传递给脚本的参数数组。 ScriptBlock
在远程计算机上运行时将无法解析本地变量。通常,您以传入变量的顺序依次访问$args[0]
,$args[1]
等变量。我喜欢使用一个技巧,即传入命名参数的哈希表,以便您可以访问它们以更具可读性的方式呈现,例如我在下面的$args.Service1
中使用ScriptBlock
的方式。
-ScriptBlock
-这是您要执行的远程代码,最好放在ScriptBlock
对象中,该对象由两个大括号{}
之间的代码表示。在这种情况下,我们正在远程计算机上调用Restart-Service
。
Restart-Service
Cmdlet 我之前提到过,您的用户至少必须在远程服务器上的Remote Management Users
组中才能使用Powershell Remoting进行连接。确实如此,但在大多数环境中,您需要成为同一远程服务器上Administrators
组的成员才能管理服务,包括启动和停止服务。因此,为了使其能够端到端地工作,您需要成为要重新启动服务的远程服务器上的管理员。
答案 1 :(得分:1)
实现您所要求的更“ Powershell方法”:
function Restart-RemoteService {
[CMDLETBINDING()]
param (
[Parameter(Mandatory)]
[String] $ServiceName,
[String] $ComputerName = 'localhost'
)
BEGIN {} #BEGIN
PROCESS {
$params = @{
'Name' = $ServiceName
'ComputerName' = $ComputerName
}
Write-Verbose "Testing status of service"
$Status = Get-Service @params
if ($status.Status -eq 'Running') {
Write-Host "Service $ServiceName has already been running"
}
ELSE {
Write-Host "Starting Service $SeviceName"
Get-Service @params | Start-Service
}
} #PROCESS
END {} #END
} #function
该功能将:
预期两个参数:
ServiceName,这是必填项,因此如果未提供,则会提示您输入
计算机名,您要在其上启动服务的计算机。如果未提供任何值,则默认为localhost。
然后,我们将解析这些参数以检查服务的状态-如果服务正在运行,则表示什么都不做,如果有其他事情,则将启动服务。
您想将此代码粘贴到Powershell窗口中并运行它,或运行某些代码编辑器(如VS Code)-以便将该函数加载到内存中。
您通过调用其名称来运行它:
Restart-RemoteService
或者您可以传递一些参数,例如:
Restart-RemoteService -ServiceName bits -ComputerName den-dc1.company.pri -Verbose