2

我编写了一个脚本,每 15 分钟检查一次 Web 服务器上的 IIS 服务状态。我通过 Windows 任务计划程序安排了这个脚本。

当我登录到服务器并手动运行脚本时,如果功能正确。当我没有登录到服务器并通过批处理脚本执行此操作时,即使它确实已启动并重新启动服务,Get-Service查询也不会返回IIS。Running

为什么当我以物理方式登录服务器与作为计划任务在后台运行时,此脚本的运行方式会有所不同?

脚本是这样调用的:C:\Scripts\powershell.exe -File verify_status.ps1 [Service param]

##############################
# Get service status
##############################
if($args[0] -ne $NULL){

    $serviceName = $args[0]
    $serverName = hostname

    $status = (Get-Service $serviceName).Status

    if ($status -ne "Running"){
        sendMail "$serviceName" "$serverName"
        Restart-Service $ServiceName
    }else{
            # Service is running, do nothing;
    }
}

======================================

编辑NULL-当脚本在没有人登录的情况下运行时,Get-Service 返回一个。如果这有帮助的话。

4

1 回答 1

0

有两件事解决了这个问题。我认为主要是更改.bat调用 powershell 脚本的脚本。

我来自:

C:\Scripts\powershell.exe -File verify_status.ps1 [Service param]

C:\Scripts\powershell.exe -File verify_status.ps1 "[Service param]"

双引号是正确将参数传递给 powershell 脚本所必需的。

我还在 powershell 脚本本身中更改了以下内容。我不确定这是否有必要,但两者的结合使这项工作:

$status = (Get-Service $serviceName).Status

$status = (Get-WmiObject -ComputerName SERVERNAME -Class Win32_Service -Filter "Name='$serviceName'").State

现在Windows Task Scheduler正确执行此脚本且没有错误。

于 2012-09-26T21:38:21.940 回答