3

再会!

前几天我偶然发现了一个小“问题”......

我通过 linux-shell 学习了脚本。在那里,可以通过字符串构造命令并按原样执行它们。

例如:

#!bin/bash
LS_ARGS='-lad'  
LS_CMD='ls'

CMD="$LS_CMD $LS_ARGS /home"    
$CMD

但现在我不得不切换到 windows powershell:

If ( $BackgroundColor ) {
    Write-Host -BackgroundColor $BackgroundColor
}
If ( $ForegroundColor ) {
    Write-Host -ForegroundColor $ForegroundColor
}
If ( $ForegroundColor -AND $BackgroundColor ) {
    Write-Host -ForegroundColor $ForegroundColor
               -BackgroundColor $BackgroundColor
}

If ( $NoNewline ) {
    If ( $BackgroundColor ) { ... }
    ElseIf ( $ForegroundColor ) { ... }
    ElseIf ( $ForegroundColor -AND $BackgroundColor ) { ... }
    Else { ... }
}

我想你知道我的意思;)有谁知道减少这种情况的方法,例如:

[string] $LS_CMD  = 'Write-Host'
[string] $LS_ARGS = '-BackgroundColor Green -NoNewLine'
[string] $CMD     = "$LS_CMD C:\temp $LS_ARGS"

由于与其他语言的这些愚蠢的比较,也许我正试图改变一些不应该改变的东西。我想这样做的主要原因是因为我试图从我的脚本中减少所有不必要的条件和段落。试图让它们更清晰......如果有人可以在这里帮助我,那就太好了。

迈克尔

4

3 回答 3

2

您可以构建一个字符串并使用以下命令执行Invoke-Expression

Invoke-Expression "$cmd $cmd_args"
于 2013-07-31T07:41:14.123 回答
2

为 cmdlet 构建一组参数的最简单方法是使用哈希表和splatting

$arguments = @{}
if( $BackgroundColor ) { $arguments.BackgroundColor = $BackgroundColor }
if( $ForegroundColor ) { $arguments.ForegroundColor = $ForegroundColor }
if( $NoNewline ) { $arguments.NoNewline = $NoNewline }
...

Write-Host text @arguments

@inWrite-Host text @arguments导致将值 in应用于$argumentscmdlet 的参数Write-Host

于 2013-08-04T00:16:22.297 回答
1

当我在这里浏览当前的 powershell 问题时,我偶然发现:
如何动态创建数组并在 Powershell 中使用它

可以使用“ Invoke-Expression ”Cmdlet:
Invoke-Expression cmdlet 计算或运行指定字符串作为命令并返回表达式或命令的结果。如果没有 Invoke-Expression,在命令行提交的字符串将原封不动地返回(回显)。

[string] $Cmd = ""
if ( $BackgroundColor ) {
   $Cmd += ' -BackgroundColor Green'
}
if ( $ForegroundColor ) {
   $Cmd += ' -ForegroundColor Black'
}
if ( $NoNewLine ) {
   $Cmd += '-NoNewLine'
}

Invoke-Expression $Cmd

该解决方案有什么问题吗?
对我来说它看起来很漂亮;)

对不起..现在我看起来我没有研究和谷歌搜索:/只是偶然发现了答案。谢谢安迪·阿里斯门迪

于 2013-07-31T07:49:48.323 回答