2010-03-04 35 views
2

我有一個非常簡單的PowerShell的1.0腳本按名稱殺死進程:爲什麼需要將PowerShell腳本參數複製到本地變量?

$target = $args[0] 
get-process | where {$_.ProcessName -eq $target} | stop-process -Force 

其中工程。但是,當我剛剛有

get-process | where {$_.ProcessName -eq $args[0]} | stop-process -Force 

它不會找到任何進程。那麼爲什麼需要將參數複製到代碼工作的局部變量中呢?

回答

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 

在哪裏對象cmdlet未命名的參數是使用腳本塊,爲您提供其計算結果爲真或假的任意腳本。在Where-Object的情況下,沒有未命名的參數傳遞給scriptblock,所以$ args應該是空的。

您已找到一種解決方法。我會建議使用命名參數例如:

param($Name, [switch]$WhatIf) 
get-process | where {$_.Name -eq $Name} | stop-process -Force -WhatIf:$WhatIf 
+0

我明白了。因爲我最初並沒有使用scriptblock,這將解釋爲什麼我的代碼工作了一段時間。 我幾個月來一直在使用PowerShell,開啓和關閉,而且我很努力地喜歡它,但這很難。 – 2010-03-04 16:49:09

+0

我認爲當他們將它命名爲「Power」殼牌時,他們就有了一些東西。這是非常強大的,但隨着這種力量來複雜。幸運的是,通過互聯網傳輸信息的速度使得從一個已經爬過PowerShell的學習曲線有點陡峭的大羣人那裏獲得幫助變得簡單快捷。 – 2010-03-04 17:02:18

相關問題