Search code examples
powershellservicejobs

PowerShell Start-Service - Unable to validate 'InputObject' issue


Problem

This is semi-related to: PowerShell Start-Service Timeout

I am trying to run through a loop to enforce timeout of the action, but continue to run into a random validation error. The code is setup as such:

$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 )

I have tried a view variations in attempts to resolve this, but I keep returning to the same root problem with the program exiting with

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 

I have looked through a number of solutions already on StackOverflow and a few other sites, but most are not similar enough to convert the answer to my problem. Most of the questions that I have seen pertain to the Invoke-Command feature of PowerShell or the issues is with a different command altogether. below is a small list of places I have sought out an answer:

powershell Start-Service fails

Powershell function throwing null exception

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

Question

Has anyone run into this situation before and know how to resolve it? Also, before anyone says "oh you are not passing in anything during the Start-Service ", the Do While loop iterates randomly between 15 and 30 times before this error is encountered.


Solution

  • So receive-job gets the results of a thread. Then it deleted those results. The error you are getting is becuase the thread completed and the results are the error of

    Start-Service $ServiceName -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
    

    which is

    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

    Becuase you didnt specify $ServiceName... you can verify this by doing the following using -keep tag and remove the -keep tag. The -keep tag will tell the job not to delete the results till next call.

    $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 )
    

    the following will show running many time and then once completed will show the following

    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 
    

    it will keep repeating that error over and over until loop is finished OR until it hits a Receive-Job without a -keep

    Sometimes it will show

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

    This is because Receive-job is giving you faster information then System is updating the Thread.state to Completed.

    IF you dont want to see that error then just delete Receive-Job or use a try catch for the error in the scriptblock