Почему PowerShell Where-Object не работает при передаче переменной? - PullRequest
2 голосов
/ 13 февраля 2012

Функция

 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

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

$args - это объект, представляющий коллекцию аргументов.

Вам необходимо:

  • Ссылка $args[0], чтобы получить строку, представляющуюпервый аргумент
  • Используйте param для определения входного параметра, например:

.

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

Я всегда рекомендую использовать param, когда это возможно, поскольку вы можете строго вводить переменные, как я делал в примере.В противном случае возможно сделать что-то непонятное, например, передать массив в качестве параметра, который может вызвать все виды трудно отслеживаемых проблем.

1 голос
/ 13 февраля 2012

$ args не работает, потому что фильтр является блоком скрипта и работает в своей области видимости. Каждая область инициализируется своими собственными $ args, поэтому вы не можете неявно передать $ args дочерней области. Так как нет условий для передачи аргументов в блок скрипта фильтра, вы должны сделать что-то вроде этого:

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

Использование именованного параметра также работает, поскольку оно неявно передается в дочернюю область.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...