Matando os processos Pai e Filho no Remoto com o Powershell

3

Estou tentando matar um processo pai e seu processo filho (haverá apenas um filho) em um computador remoto. Ao executar este script (que é parte de um script maior), recebo o seguinte erro. O PowerShell Newbie, portanto, qualquer sugestão de melhoria além de resolver o erro é muito bem-vinda.

Cannot bind parameter 'Process'. Cannot convert the "Kill-ChildProcess" value of type "System.String" to type "System.Management.Automation.ScriptBlock".
        + CategoryInfo          : InvalidArgument: (:) [ForEach-Object], ParameterBindingException
        + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.ForEachObjectCommand

Script:

$scriptBlock =  {                 
        function Kill-ChildProcess(){
            param($ID=$PID)
                $CustomColumnID = @{
                Name = 'Id'
                Expression = { [Int[]]$_.ProcessID }
                }

                Write-Host $ID
                $result = Get-WmiObject -Class Win32_Process -Filter "ParentProcessID=$ID" |
                Select-Object -Property ProcessName, $CustomColumnID, CommandLine

                $result | Where-Object { $_.ID -ne $null } | Stop-Process
        }


         Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach Kill-ChildProcess -id {$_.ID};
         Get-Process $args[0] -ErrorAction SilentlyContinue | Stop-Process -ErrorAction SilentlyContinue;
    };


Invoke-Command -Session $session  -ArgumentList $processToKill -ScriptBlock $scriptBlock
    
por MrBliz 16.11.2015 / 18:09

2 respostas

4

O erro que você recebe é porque a linha a seguir está incorretamente expressa:

Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach Kill-ChildProcess -id {$_.ID};

O erro está tentando (no microsoft fashion) dizer que ele precisa de um bloco de script depois de um ForEach . Substitua a linha pelo seguinte para continuar após esse erro:

Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach {Kill-ChildProcess -id $_.ID}

Além disso, apenas um aparte, mas o powershell não requer terminadores de linha, a menos que você esteja processando vários comandos na mesma linha do shell. Resumindo, você não precisa terminar todas as linhas com ; .

    
por 16.11.2015 / 21:00
1

Após o ForEach-Object (or aliases: ForEach, %) , coloque o código que segue nas chaves {} .

Portanto, altere esta linha do que você tem:

Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach Kill-ChildProcess -id {$_.ID};

para isso, que coloca corretamente as chaves ao redor do código após ForEach-Object :

 Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach { Kill-ChildProcess -id $_.ID }

Deixe-nos saber se isso resolve aquela mensagem de erro específica que você postou.

Além disso, aqui estão algumas informações sobre como usar ForEach-Object para sua referência:

Beginning in Windows PowerShell 3.0, there are two different ways to construct a ForEach-Object command.

Script block.

You can use a script block to specify the operation. Within the script block, use the $_ variable to represent the current object. The script block is the value of the Process parameter. The script block can contain any Windows PowerShell script.

For example, the following command gets the value of the ProcessName property of each process on the computer.

Get-Process | ForEach-Object {$_.ProcessName}

Operation statement.

You can also write a operation statement, which is much more like natural language. You can use the operation statement to specify a property value or call a method. Operation statements were introduced in Windows PowerShell 3.0.

For example, the following command also gets the value of the ProcessName property of each process on the computer.

Get-Process | ForEach-Object ProcessName

When using the script block format, in addition to using the script block that describes the operations that are performed on each input object, you can provide two additional script blocks. The Begin script block, which is the value of the Begin parameter, runs before the first input object is processed. The End script block, which is the value of the End parameter, runs after the last input object is processed.

    
por 16.11.2015 / 21:06