【发布时间】:2018-10-18 22:21:25
【问题描述】:
这里是一个例子,我有一个名为“s1”的远程服务器,我想杀死里面的calc、notepad、winword的进程。
我可能有两种方法可以做到这一点,
- 使用管道
Get-Process -computername s1 -name "calc", "notepad", "winword" | Stop-Process
- 使用 InputObject 参数
$processes = Get-Process -computername s1 -name "calc", "notepad", "winword"
Stop-Process -InputObject $processes
IMO,我认为第二种方式比第一种方式要好得多。
据说PowerShell中的管道实际上是一个一个的将对象传递给下面的Cmdlet。在这种情况下,Stop-Process 需要与远程计算机“s1”通信多次并一个一个地杀死这些进程。
相比之下,第二种方式,我猜Stop-Process只会与远程计算机“s1”通信一次,并一次性完成操作。
我理解正确吗?
谢谢
马丁
【问题讨论】:
-
这也让我很困惑。适当的用法是始终通过管道输入命令。从我能收集到的。 -inputobject 会将所有项目组合为一个,从而混淆系统。一些 cmdlet 可能会更好地处理它。我从来没有发现需要使用它。它还为您的 cmd 添加了一个步骤。将输出放入变量中。然后将其放入您的命令中,而不是将其直接放入命令中(至少在大多数情况下),变量也是快照。如果您尝试通过停止进程关闭一个老化的变量,您可能会杀死错误的进程。等等……
-
停止进程也可以只取一个名称参数,节省更多步骤。
Stop-Process -computername s1 -name "calc", "notepad", "winword" -
另一个选项是调用命令,您可以将命令作为一个发送,它会立即执行整个操作。不过要小心。默认情况下,invoke-command 在您使用它的任何机器上构建配置文件。所以通过 pssessionoptions 更改默认值
-
@RobertCotterman:
Stop-Process没有-ComputerName参数。 -
我在答案中添加了更一般的
-InputObject与管道信息;抄送@RobertCotterman。
标签: powershell