Сделать текущий элемент ($ _ / $ PSItem) доступным для параметра scriptblock в функции модуля - PullRequest
0 голосов
/ 14 февраля 2019

В основном я пытаюсь заставить работать приведенную ниже функцию «встроенного оператора if» ( кредит здесь )

Function IIf($If, $Then, $Else) {
    If ($If -IsNot "Boolean") {$_ = $If}
    If ($If) {If ($Then -is "ScriptBlock") {&$Then} Else {$Then}}
    Else {If ($Else -is "ScriptBlock") {&$Else} Else {$Else}}
}

При использовании PowerShell v5, похоже, она не работаетменя и называя это как

IIf "some string" {$_.Substring(0, 4)} "no string found :("

, выдает следующую ошибку:

You cannot call a method on a null-valued expression.
At line:1 char:20
+ IIf "some string" {$_.Substring(0, 4)} "no string found :("
+                    ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Итак, в качестве более общего вопроса, как сделать $_ доступнымк блоку сценария, переданному в функцию?

Я пытался выполнить этот ответ , но похоже, что он предназначен для передачи его в отдельный процесс, а это не то, что мне нужно.

Обновление: Кажется, проблема в том, что у меня есть функция в модуле, а не непосредственно в сеансе сценария / PS.Обходным путем может быть отказ от его установки в модуль, но я считаю, что модуль более переносим, ​​поэтому я хотел бы найти решение для этого.

1 Ответ

0 голосов
/ 15 февраля 2019

Хотя у меня нет объяснения вашего симптома, есть два изменения, которые стоит сделать:

  • Не не попытаться присвоить $_ напрямую;это автоматическая переменная под управлением PowerShell, не предназначенная для установки пользовательским кодом (даже если она может работать, на нее не следует полагаться).

    • Вместо этого используйте командлет ForEach-Object для неявной установки $_ через его параметр -InputObject.
  • Используйте оператор -is с типом литералы , такие как [Boolean], а не тип имена , такие как "Boolean".

Function IIf($If, $Then, $Else) {
  If ($If) { 
    If ($Then -is [scriptblock]) { ForEach-Object -InputObject $If -Process $Then } 
    Else { $Then } 
  } Else {
    If ($Else -is [scriptblock]) { ForEach-Object -InputObject $If -Process $Else }
    Else { $Else }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...