2012-02-13 50 views
2

功能爲什麼傳遞變量時PowerShell Where-Object不起作用?

function findf { 
    Write-Host "Find files that match: $args" 
    gci -r | Where-Object { $_.name -match ".*$args.*" } 
} 

似乎並沒有工作。例如,

findf .exe 

- 打印到EXE文件了一堆東西,不限制輸出 -

任何想法我做錯了嗎?

如果我從PowerShell命令窗口中運行相同的命令命令作品:

gci -r | Where-Object { $_.name -match ".*.exe.*" } 

這工作,並正確顯示我匹配* .EXE模式

回答

4

$args,該文件是代表一個對象一個收集的論據。

您應該:

  • 參考$args[0]來獲取表示第一個參數
  • 使用param來定義,如輸入參數字符串:

function findf { 
    param ([string]$SeachStr) 
    Write-Host "Find files that match: $SeachStr" 
    gci -r | Where-Object { $_.name -match ".*$SeachStr.*" } 
} 

我總是提倡用param可能的情況下,因爲你可以強烈地輸入你的變量,如我的例子一樣。否則,可能會做一些混淆,例如將數組作爲參數傳遞,這會導致各種難以追蹤的問題。

+0

這工作。謝謝。 – PatS 2012-02-13 18:20:49

1

$ args不工作,因爲過濾器是一個腳本塊,並運行在它自己的作用域中。每個作用域都用它自己的$ args進行初始化,所以你不能隱式地將$ args傳遞給子作用域。由於有傳遞參數的過濾器腳本塊沒有規定,你必須做這樣的事情:

function findf { 
     Write-Host "Find files that match: $args" 
     $filter = $args[0] 
     gci -r | Where-Object { $_.name -match ".*$filter.*" } 
    } 

使用命名參數也適用,因爲這將隱式傳遞給孩子的範圍。

相關問題