我尝试了多种使用数组来终止 PID 的方法,但都失败了。如果我使用echo
命令而不是taskkill
它,它会正常工作,但是如果我使用taskkill
命令,我会得到附件中的错误...
还尝试将Array
数据类型转换为,Int32
但仍然没有成功。
$a = @(Get-WmiObject Win32_Process -Filter "name like 'powershell.exe' and commandLine like '%cycle%'" | Select-Object ProcessId)
if ($a )
{
taskkill.exe /F /PID $a[0]
taskkill.exe /F /PID $a[1]
taskkill.exe /F /PID $a[2]
}
错误:
答案1
附加.ProcessId
到变量值的末尾$a
(因为您已经将其括在括号中),以便仅列出ProcessId
数组中匹配的数字(没有列标题值)。然后将匹配的$a
数组通过ForEach-Object
管道传输到循环中,以迭代ProcessId
数组值并将其传递到taskkill
命令中,从而相应地终止进程。
电源外壳
$a = @(Get-WmiObject Win32_Process -Filter "name like 'powershell.exe' and commandLine like '%cycle%'" | Select-Object ProcessId).ProcessId;
$a | ForEach-Object {taskkill.exe /F /PID $_};
问题你遇到的是因为使用这个代码
@(Get-WmiObject Win32_Process -Filter "name like 'powershell.exe' and commandLine like '%cycle%'" | Select-Object ProcessId)
给出包含无法解释的标题列的输出
taskkill
。ProcessId --------- 2244
使用此代码
@(Get-WmiObject Win32_Process -Filter "name like 'powershell.exe' and commandLine like '%cycle%'" | Select-Object ProcessId).ProcessId
给出此输出,该输出仅是可以用于相应处理/终止的
int
匹配进程的值。taskkill
2244
笔记:使用
$_.ProcessId
现有代码可能会按照您编写的方式工作,以在该级别进行扩展,因此taskkill.exe /F /PID $_.ProcessId
也可能足够。但我不认为条件if()
是完全必要的,所以我会省略它。