微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

电源外壳管道命令和使用 Foreach-Object

如何解决电源外壳管道命令和使用 Foreach-Object

抱歉,如果这个问题已经得到回答,我可以找到类似的问题,但不是我需要问的确切问题。

举两个例子:

 1. Get-Process -name msedge,putty | Stop-Process
 2. Get-Process -name msedge,putty | Foreach-Object {Stop-Process $_}

两者都在做同样的操作。每种方法使用的方法是什么?在第一个示例只是为了代码可读性/美观而省略 Foreach-Object 构造的意义上,它们是否相同?

解决方法

第一个示例要求 Cmdlet 支持通过管道绑定相关参数。在您的情况下,Stop-Process 会将 Process 对象从管道绑定到它的 -InputObject 参数。

您可以使用 get-help stop-process -Parameter * 检查并查看哪些参数具有“接受管道输入?”设置为真。

如果 Cmdlet 不支持相关参数值的绑定,您可以将 ForEach-Object 包裹在它周围,就像您在第二个示例中所做的那样。通过这种方式,您可以使用自动变量 $_ 将当前管道对象(或您从中派生的信息)“手动”绑定到相应的参数。

如果 Cmdlet 支持绑定管道中的参数值,您应该使用什么方法?不幸的是,这取决于。可以编写行为不同的 Cmdlet,具体取决于参数值的绑定方式。让我来说明这一点:

function Test-BindingFoo {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline)]
        [string[]]
        $InputParameter
    )
    
    begin {
        Write-Host "[BEGIN]"
    }
    
    process {
        foreach ($value in $InputParameter) {
            Write-Host "The current value is: $value"
        }
    }
    
    end {
        Write-Host "[END]"
    }
}

如果您使用管道绑定执行此 Cmdlet,则该函数的 Begin 块只会执行一次:

❯ "foo1","foo2" | Test-BindingFoo
[BEGIN]
The current value is: foo1
The current value is: foo2
[END]

如果您使用 ForEach-Object,则每次对象通过管道时都会执行 Begin 块:

❯ "foo1","foo2" | ForEach-Object { Test-BindingFoo $_ }
[BEGIN]
The current value is: foo1
[END]
[BEGIN]
The current value is: foo2
[END]

在实施良好的 Cmdlet 中,这里的差异应该无关紧要。但是我发现当以我们在此处讨论的方式传入参数时,了解 Cmdlet 内部发生的情况很有用。

,

你也可以这样做,在进程对象(操作语句)上使用kill方法:

Get-Process msedge,putty | Foreach-Object kill
# or
Get-Process msedge,putty | Foreach-Object -membername kill

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?