Динамически создаваемые аргументы параметров для PowerShell Get-ChildItem - PullRequest
0 голосов
/ 14 июня 2019

Короче говоря, я пытаюсь динамически использовать параметр -Directory или -File в PowerShell Get-ChildItem.Угадай, что?Я не могу.

Вот сделка (примечание: псевдокод):

Param(
    [string]$filter = $(throw "Error: name"),
    [string]$type = $(throw "error: file or directory")
)

if( $type -eq "file" ) {
    $mode = '-File'
}
elseif( $type -eq "directory" ) {
    $mode = '-Directory'
}

Function Find_Plugin_folder {
    Write-Host "look for: '$($filter)'"
    Invoke-Command -ComputerName (Get-Content servers.txt ) -ScriptBlock {
        (Get-ChildItem -Path "z:\www" -Depth 5 $Using:mode -Filter $Using:filter -Recurse ) | %{$_.FullName}
    } -ThrottleLimit 80 
}

Find_Plugin_folder

$Using:mode, где он выдает ошибку, либо:

PS C:\Users\janreilink> v:\test.ps1 vevida-optimizer file
look for: 'vevida-optimizer'
A positional parameter cannot be found that accepts argument '-File'.
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : webserver-01.example.net

Или

PS C:\Users\janreilink> v:\test.ps1 vevida-optimizer directory
look for: 'vevida-optimizer'
A positional parameter cannot be found that accepts argument '-Directory'.
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
    + PSComputerName        : webserver-01.example.net

Я читал о наборах динамических параметров весь день, но пока не могу обернуться.Любые пункты очень (очень, очень) ценятся.

1 Ответ

1 голос
/ 14 июня 2019

Вместо этого вы захотите использовать splatting.Начните с создания хеш-таблицы с некоторыми или всеми параметрами, которые вы хотите передать:

$dynamicArgs = @{}

if( $type -eq "file" ) {
    $dynamicArgs['File'] = $true
}
elseif( $type -eq "directory" ) {
    $dynamicArgs['Directory'] = $true
}

Затем внутри Invoke-Command добавьте префикс имени переменной к @, чтобы указать, что вы хотите "splat"Аргументы:

Get-ChildItem -Path "z:\www" -Depth 5 @Using:dynamicArgs -Filter $Using:filter -Recurse

Если таблица разбивки содержит ключ File со значением $true, это эквивалентно добавлению -File:$true в командной строке и наоборот для Directory аргумент

...