使用 Powershell 远程终止父进程和子进程

使用 Powershell 远程终止父进程和子进程

我试图在远程计算机上终止父进程及其子进程(只有一个子进程)。执行此脚本(它是更大脚本的一部分)时,我收到以下错误。PowerShell 新手,因此除了解决错误之外,任何改进建议都非常受欢迎。

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

脚本:

$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

答案1

您收到的错误是因为以下行表达不正确:

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

该错误试图(以微软的方式)告诉您它在 之后需要一个脚本块ForEach。用以下内容替换该行以继续解决该错误:

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

另外,顺便说一句,除非您在 shell 中处理同一行上的多个命令,否则 powershell 不需要行终止符。简而言之,您不需要用 来结束每一行;

答案2

ForEach-Object (or aliases: ForEach, %)下面的代码放入花括号中{}

因此,请将这一行从现有内容中修改如下:

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

对此,正确地将花括号放在代码后面ForEach-Object

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

如果此方法可以解决您发布的特定错误消息,请告知我们。


另外,这里有一些使用信息ForEach-Object供您参考:

从 Windows PowerShell 3.0 开始,有两种不同的方法来构造ForEach-Object命令。

脚本块。

您可以使用脚本块来指定操作。在脚本块中,使用变量$_来表示当前对象。脚本块是 Process 参数的值。脚本块可以包含任何 Windows PowerShell 脚本。

例如,以下命令获取计算机上每个进程的 ProcessName 属性的值。

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

操作说明

您还可以编写操作语句,这更像自然语言。您可以使用操作语句来指定属性值或调用方法。操作语句是在 Windows PowerShell 3.0 中引入的。

例如,以下命令还获取计算机上每个进程的 ProcessName 属性的值。

Get-Process | ForEach-Object ProcessName

使用脚本块格式时,除了使用描述对每个输入对象执行的操作的脚本块外,还可以提供两个附加脚本块。脚本Begin 块(Begin 参数的值)在处理第一个输入对象之前运行。End脚本块(End 参数的值)在处理最后一个输入对象之后运行。

相关内容