【问题标题】:Killing processes from list of executable names in PowerShell从 PowerShell 中的可执行名称列表中杀死进程
【发布时间】:2010-02-24 18:36:45
【问题描述】:

我有一个 PowerShell 函数,它返回一个可执行名称列表(带有文件扩展名),如果它们正在运行,我会尝试杀死其中的任何一个,但没有多大成功。这是我正在使用的命令:

Get-Executable-Names `
| where { $_ -match ".exe" } `
| foreach { $_ -replace ".exe" } `
| foreach { ps $_ } `
| kill

如果我将 Get-Executable-Names 的输出存储在一个变量中并显示其内容,它会显示为:

Path
----
A.exe
B.exe
C.exe

PowerShell 报告此错误:

Get-Process:找不到名为“@{Path=A}”的进程。验证进程名称并再次调用 cmdlet。
+ $Get-Executable-Names |其中 { $_ -match ".exe" } | foreach { $_ -replace ".exe" } | foreach { ps + CategoryInfo : ObjectNotFound: (@{Path=A}:String) [Get-Process], ProcessCommandException

看来-replace操作将管道数据改成如下格式:

@(Path=A)
@(Path=B)
@(Path=C)

我不明白。我确定我只是在这里误解了 PowerShell 的对象模型,但我忽略了什么?

【问题讨论】:

    标签: powershell process kill


    【解决方案1】:

    尝试在调用 GetExecutableNames 之后添加以下内容

    %{ $_.Path }
    

    完整答案

    Get-Executable-Names 
    | where { $_ -match ".exe" } 
    | %{ $_.Path }
    | %{ $_ -replace ".exe" } 
    | %{ ps $_ } 
    | kill
    

    【讨论】:

    • 为了解释发生了什么,Get-Executable-Names(你应该删除最后一个破折号)返回一个哈希表数组。当您将哈希表转换为字符串(-replace 需要该字符串)时,您将获得表示哈希表的代码。
    猜你喜欢
    • 2014-05-18
    • 2011-02-25
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2018-02-14
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多