我试图杀死一个父进程,它是一个远程计算机上的subprocess(只有一个孩子)。 当执行这个脚本(这是更大的一部分),我得到以下错误。 PowerShell新手,所以任何改善的build议,超越解决错误是最受欢迎的。
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
你得到的错误是因为下面这行不正确的expression:
Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach Kill-ChildProcess -id {$_.ID};
错误是试图(以微软的方式)告诉你,它需要一个ForEach后的脚本块。 将该行replace为以下内容以继续发生该错误:
Get-Process $args[0] -ErrorAction SilentlyContinue | ForEach {Kill-ChildProcess -id $_.ID}
此外,只是在旁边,但powershell不需要行终止符,除非你在shell中的同一行上处理多个命令。 总之,你不需要结束每一行; 。
在你的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命令。脚本块。
您可以使用脚本块来指定操作。 在脚本块中,使用
$_variables来表示当前对象。 脚本块是Process参数的值。 该脚本块可以包含任何Windows PowerShell脚本。例如,以下命令获取计算机上每个进程的ProcessName属性的值。
Get-Process | ForEach-Object {$_.ProcessName}操作说明 。
你也可以编写一个更像自然语言的操作语句。 您可以使用操作语句指定属性值或调用方法。 操作语句是在Windows PowerShell 3.0中引入的。
例如,以下命令也获取计算机上每个进程的ProcessName属性的值。
Get-Process | ForEach-Object ProcessName使用脚本块格式时,除了使用描述每个input对象上执行的操作的脚本块之外,还可以提供两个附加脚本块。
Begin脚本块(Begin参数的值)在处理第一个input对象之前运行。End脚本块是End参数的值,在处理完最后一个input对象后运行。