Powershell脚本重启服务

时间:2014-09-07 19:45:24

标签: powershell

我从博客中获取此脚本并对其进行修改以适应我的环境。但是,我在迭代foreach循环并获取服务状态或远程计算机($ unregisteredVM)时遇到问题。

似乎Get-Service试图查询执行脚本的计算机而不是远程计算机。

此外,我尝试运行脚本部分来抓取计算机的状态,并将该变量设置为-Computername参数,但它似乎不接受它。

$ icaservicestate = Get-Service PorticaService -ComputerName $ unregisteredVM |选择状态

我缺少什么?以下是整个代码。

##Load Citrix Modules
asnp Citrix.*

#Variables for email
[string[]]$recipients = "xxxxx@xxxxxx.com"
$fromEmail = "xxxxx@xxxx.com"
$server = "itopia-us.mail.protection.outlook.com"
$date= Get-Date

##Check for VMs on and unregistered
$unregisteredVMs = Get-BrokerDesktop -RegistrationState Unregistered | Select MachineName
[string]$emailVMs = Get-BrokerDesktop -RegistrationState Unregistered | Select MachineName | ft -wrap -autosize | Out-String

IF (!$unregisteredVMs) {
##Send all clear email
[string]$emailBody = "There were no powered on desktops in an unregistered state."
send-mailmessage -from $fromEmail -to $recipients -subject " XenDesktop Daily Check - $date" -body $emailBody -priority High -smtpServer $server
}
Else {
##If powered-on and unregistered, perform a forceful restart
foreach ($unregisteredVM in $unregisteredVMs)
{
 $icaservicestate = Get-Service PorticaService -ComputerName $unregisteredVM | select status
IF ($icaservicestate = Stopped) {
Set-Service -Name PorticaService -Status Running
}
Else {
sc \\$unregisteredVM start PorticaService
}
 #Write-Host "Hello, I am unregistered: $unregisteredVM"
}

#Send an email report of VMs to be restarted due to being in an unregistered state
[string]$emailBody = "The following desktops were forcefully restarted due to not registering with the DDCs in a timely manner. `n $emailVMs"
send-mailmessage -from $fromEmail -to $recipients -subject " XenDesktop Daily Check - $date" -body $emailBody -priority High -smtpServer $server
}

3 个答案:

答案 0 :(得分:1)

我不确定这是否是你的整个问题,但我不认为这是你想要的:

IF ($icaservicestate = Stopped)

assigns执行名为Stopped的命令到变量$ icaservicestate的结果。我怀疑你有一个名为Stopped的命令。对于等式比较,请使用-eq并引用Stopped

IF ($icaservicestate -eq 'Stopped') { ... }

答案 1 :(得分:1)

有两个可能的原因导致您无法获得所需的结果。

首先:在Powershell中,单个等号是赋值运算符 您的if语句第24行正在将$icaservicestate的值重新分配给错误

$icaservicestate = Get-Service PorticaService -ComputerName $unregisteredVM | select status
IF ($icaservicestate = Stopped) {
    Set-Service -Name PorticaService -Status Running
}
  

使用IF ($icaservice -eq 'stopped') {


第二次:第23行Cmdlet Get-Service可能由于第11行传递给您的对象而失败

$unregisteredVMs = Get-BrokerDesktop -RegistrationState Unregistered | Select MachineName

在上面的行中,您生成了一个[array]个对象,每个对象都有一个名为MachineName的属性。
在第23行,您尝试将对象传递给ComputerName Cmdlet的Get-Service参数。要解决此问题,您可以在Get-Service cmdlet中使用$ unregisteredVM.MachineName

  

$ icaservicestate = Get-Service PorticaService -ComputerName $ unregisteredVM.MachineName |选择状态

您可以通过在提示符处键入以下内容,详细了解属性值在管道中传递的方式:
help about_piplines并寻找'ByValue'和'ByPropertyName'

<强>更新

if ($icaservicestate -eq 'Stopped') {
    Get-Service -Name PorticaService -ComputerName $unregisteredVM.MachineName | Set-Service -Status Running
}

以前,行Set-Service -Name PorticaService -Status Running将尝试在本地计算机上启动该服务。

首先,我们在远程计算机上获取对PorticaService的引用,然后将该对象传递给Set-Service Cmdlet并将状态设置为运行。

答案 2 :(得分:0)

我认为您的脚本不起作用,因为您从“get-brokerdesktop”返回的计算机名称采用domainname \ vdiname格式。对于“get-service -computername”,您只需输入主机名。 要“隔离”我要做的主机名: $ unregisteredVM = $ unregisteredVM.machinename -replace(“domainname \,”“) $ unregisteredVM = $ unregsiteredVM.trim()

现在$ unregisteredVM应该只包含主机名。