我有一个非常简单的Powershell v1.0脚本来按名称终止进程:
$target = $args[0]
get-process | where {$_.ProcessName -eq $target} | stop-process -Force
哪个有效。但是,当我刚刚
时get-process | where {$_.ProcessName -eq $args[0]} | stop-process -Force
它找不到任何进程。那么为什么需要将参数复制到局部变量中以使代码起作用?
答案 0 :(得分:5)
这是昨天另一个post。基本上,一个脚本块{ <script> }
获得了自己的$ args,表示传递给它的未命名参数,例如:
PS> & { $OFS=', '; "`$args is $args" } arg1 7 3.14 (get-date)
$args is arg1, 7, 3.14, 03/04/2010 09:46:50
Where-Object cmdlet正在使用scriptblock来提供任意脚本,并将其评估为true或false。在Where-Object的情况下,没有未命名的参数传递到scriptblock中,因此$ args应为空。
你找到了一个解决方法。我建议的是使用命名参数,例如:
param($Name, [switch]$WhatIf)
get-process | where {$_.Name -eq $Name} | stop-process -Force -WhatIf:$WhatIf