为什么 PowerShell Where-Object 在传递变量时不起作用?

Pat*_*atS 3 powershell

功能

 function findf {
     Write-Host "Find files that match: $args"
     gci -r | Where-Object { $_.name -match ".*$args.*" }
 }
Run Code Online (Sandbox Code Playgroud)

似乎不起作用。例如,

 findf .exe
Run Code Online (Sandbox Code Playgroud)

-- 打印一堆不限制输出到 EXE 文件的内容 --

任何想法我做错了什么?

如果我从 PowerShell 命令窗口运行相同的命令,该命令将起作用:

 gci -r | Where-Object { $_.name -match ".*.exe.*" }
Run Code Online (Sandbox Code Playgroud)

这有效并正确地向我显示与 *.EXE 模式匹配的文件

JNK*_*JNK 5

$args是一个表示参数集合的对象。

你应该:

  • $args[0]获取表示第一个参数的字符串的参考
  • 使用param定义,如输入参数:

.

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

我总是提倡param尽可能使用,因为您可以像我在示例中所做的那样强输入变量。否则可能会做一些令人困惑的事情,比如将数组作为参数传递,这会导致各种难以追踪的问题。