PowerShell Start-Service - 无法验证“InputObject”问题

时间:2017-10-03 15:59:28

标签: powershell service jobs

问题

这与以下内容有关:PowerShell Start-Service Timeout

我正在尝试运行循环以强制执行操作的超时,但继续遇到随机验证错误。代码设置如下:

$timeout = New-TimeSpan -Seconds $SecondsToWait
$timer = [System.Diagnostics.Stopwatch]::StartNew()

$j = Start-Job -ScriptBlock { Start-Service $ServiceName -ErrorAction SilentlyContinue -WarningAction SilentlyContinue }
$count = 0

Do {
    If ($j.State -eq 'Running') {
        If ($timer.Elapsed.seconds -ne $count) {
            $count ++
            Write-Host "Elapsed Time: $($timer.Elapsed.seconds)"
        }

        $j | Receive-Job
    }
} While ( $timer.Elapsed -lt $timeout )

我尝试过尝试解决此问题的视图变体,但我一直在返回与

退出的程序相同的根问题
Cannot validate argument on parameter 'InputObject'. The Argument is null or empty. 
Supply an argument that is not null or empty and then try the command again.

At C:file\path.ps1:543 char:13
         $j | Receive-Job
CategoryInfo         : InvalidData: (:) [Start-Service], ParameterBindingValidationException
FullyQualifiedErrorId: ParameterArgumentValidatinErrorNullNotAllowed,Microsoft.PowerShell.Commands.StartServiceCommand 

我已经在StackOverflow和其他一些网站上查看了许多解决方案,但大多数解决方案都不足以将答案转换为我的问题。我所看到的大多数问题都与PowerShell的Invoke-Command功能或问题完全不同。下面是我找到答案的一小部分名单:

powershell Start-Service fails

Powershell function throwing null exception

"Cannot validate argument on parameter 'Identity'" while changing the description for multiple users

问题

有没有人遇到这种情况并知道如何解决它?此外,在任何人说“哦,你没有在Start-Service期间传递任何东西”之前,Do While循环会在遇到此错误之前随机重复15到30次。

1 个答案:

答案 0 :(得分:1)

所以receive-job获取一个线程的结果。然后它删除了那些结果。你得到的错误是因为线程已经完成,结果是错误

Start-Service $ServiceName -ErrorAction SilentlyContinue -WarningAction SilentlyContinue

  

无法验证参数'InputObject'的参数。争论是   null或空。提供一个非null或空的参数,然后   再次尝试该命令。       + CategoryInfo:InvalidData :( :) [Start-Service],ParameterBindingValidationException       + FullyQualifiedErrorId:ParameterArgumentValidationError,Microsoft.PowerShell.Commands.StartServiceCommand       + PSComputerName:localhost

因为你没有指定$ ServiceName ... 您可以通过使用-keep标记执行以下操作来验证这一点并删除-keep标记。 -keep标记将告诉作业在下次调用之前不删除结果。

$j = Start-Job -ScriptBlock { Start-Service $ServiceName -ErrorAction SilentlyContinue -WarningAction SilentlyContinue }
$count = 0

Do {

    $j.State
    $j | Receive-Job -keep


} While ( $timer.Elapsed -lt $timeout )

以下将显示运行多次,然后一旦完成将显示以下

Running
Running
Running
Completed
Cannot validate argument on parameter 'InputObject'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.
    + CategoryInfo          : InvalidData: (:) [Start-Service], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.StartServiceCommand
    + PSComputerName        : localhost 

它将一直重复该错误,直到循环结束或者直到它遇到接收作业而没有 -keep

有时它会显示

Running
{Results here}
Running
{Results here}
Complete
{Results here}

这是因为Receive-job为您提供了更快的信息,然后System将Thread.state更新为Completed。

如果您不想看到该错误,则只需删除接收作业或使用尝试捕获来处理scriptblock中的错误