我试图在远程计算机上终止父进程及其子进程(只有一个子进程)。执行此脚本(它是更大脚本的一部分)时,我收到以下错误。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 参数的值)在处理最后一个输入对象之后运行。