使用脚本中的参数执行powershell命令

时间:2019-01-22 08:04:07

标签: powershell arguments

这是我的Powershell脚本中的哈希表(使用 Get-PSReadlineOption 提取的数据):

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

我正在尝试使用 Set-PSReadlineOption 命令设置Powershell主题颜色:

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 :(得分:3)

您将所有参数作为单个字符串传递,这不是您想要的。

您要执行的操作称为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"