Использование одной и той же переменной в качестве параметра и хранилища при вызове функции в powershell - PullRequest
0 голосов
/ 17 июня 2019

Недавно у меня была эта проблема.После многочасовых исследований я, наконец, обнаружил, что проблема заключается в использовании той же переменной для:

  • Сохранения значения, возвращаемого функцией
  • Передача его в качестве параметра вfunction

Таким образом, учитывается следующая функция:

Function Create-Filter($filter)
{    
    $filter.Split(',') | ForEach-Object {"*.$($_.Trim())"}
    return
}

(Вышеупомянутая функция получает строковую переменную, такую ​​как "csproj, vbproj", и преобразует ее в * .csproj * .vbproj.)

... приведенный ниже код не работает, переменная $ filter, используемая для параметра -Include, не любит Get-ChildItem и ничего не возвращает:

$filter = "csproj, vbproj"
$filter = Create-Filter ($filter)
Get-ChildItem "D:\Path\To\My\Root\Folder" -Include $filter -Recurse

Вместо этого стоитработа с использованием другой переменной для хранения и передачи ее в качестве параметра:

$filter = "csproj, vbproj"  
$formattedfilter = Create-Filter ($filter)
Get-ChildItem "D:\Path\To\My\Root\Folder" -Include $formattedfilter -Recurse

... теперь работает Get-ChildItem.

В других языках можно использовать ту же переменную для передачиэто как параметр и сохранение значения, возвращаемого функцией.Не могли бы вы объяснить, почему в powershell это не работает, если используется одна и та же переменная?

1 Ответ

3 голосов
/ 17 июня 2019

Не уверен, почему ваш код не будет работать, так как возврат в вашем случае избыточен, а результат помещается в выходной поток.

То же код, но рефакторинг:

function New-Filter
{    
    param (
        [Parameter(Mandatory=$true)]
        [String[]] $filter
    )

    return $filter.Split(',') | ForEach-Object {"*.$($_.Trim())"}
}

$filter = @("csproj, vbproj")
$filter = New-Filter $filter
Get-ChildItem -Path "D:\Path\To\My\Root\Folder" -Include $filter -Recurse
...