Выполнить команду powershell с аргументами из скрипта - PullRequest
0 голосов
/ 22 января 2019

это хеш-таблица в моем скрипте powershell (данные извлекаются с использованием Get-PSReadlineOption ):

$theme = @{}
$theme["CommentForegroundColor"] = "DarkGreen"
$theme["CommentBackgroundColor"] = "Black"
$theme["KeywordForegroundColor"] = "Green"
$theme["KeywordBackgroundColor"] = "Black"

Я пытаюсь установить цвета темы powershell с помощью Set-PSReadlineOption команда:

foreach ($colorTokenKey in $theme.keys) {
    $c=$theme[$colorTokenKey]
    echo "$colorTokenKey will be set to $c"
    $colorTokenArgs = $colorTokenKey.Replace("ForegroundColor"," -ForegroundColor")
    $colorTokenArgs = $colorTokenArgs.Replace("BackgroundColor"," -BackgroundColor")
    $colorTokenArgs = $colorTokenArgs.Split(" ")
    $tokenKind = $colorTokenArgs[0]
    $tokenForegroundOrBackground = $colorTokenArgs[1]
    $params = "-TokenKind $tokenKind $tokenForegroundOrBackground $c"
    echo $params
    & Set-PSReadlineOption $params
}

Но когда я запускаю это, я получаю

CommandBackgroundColor will be set to White
-TokenKind Command -BackgroundColor White
Set-PSReadlineOption : Cannot bind parameter 'TokenKind'. Cannot convert value "-Tok
enKind Command -BackgroundColor White" to type "Microsoft.PowerShell.TokenClassifica
tion". Error: "Unable to match the identifier name -TokenKind Command -BackgroundCol
or White to a valid enumerator name. Specify one of the following enumerator names a
nd try again:
None, Comment, Keyword, String, Operator, Variable, Command, Parameter, Type, Number
, Member"
At C:\Users\...\PowerShellColors.ps1:88 char:28
+     & Set-PSReadlineOption $params

Что я делаю не так?

1 Ответ

0 голосов
/ 22 января 2019

Вы передаете все свои аргументы в виде единственной строки, что не то, что вам нужно.

То, что вы хотите сделать, называется splatting .

Измените свои последние строки следующим образом:

$params = @{
    "TokenKind" = $tokenKind
    $tokenForegroundOrBackground = $c
}
Set-PSReadlineOption @params

Также имейте в виду, что вам нужно передать параметры без ведущего -!Таким образом, вам также придется изменить это:

$colorTokenArgs = $colorTokenKey.Replace("ForegroundColor"," ForegroundColor")
$colorTokenArgs = $colorTokenArgs.Replace("BackgroundColor"," BackgroundColor")

(или, может быть, сначала определите это по-другому.)

Несколько хакерской альтернативой будет использование Invoke-Expression, который выполняет строку как команду:

Invoke-Expression "Set-PSReadlineOption $params"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...