在Powershell中构建和执行Command-String

时间:2013-07-31 07:16:48

标签: bash powershell scripting parameter-passing

美好的一天!

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

我通过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"

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

迈克尔

3 个答案:

答案 0 :(得分:2)

您可以使用Invoke-Expression构建字符串并执行:

Invoke-Expression "$cmd $cmd_args"

答案 1 :(得分:2)

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

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

Write-Host text @arguments

@中的Write-Host text @arguments会导致$arguments中的值应用于Write-Host cmdlet的参数。

答案 2 :(得分:1)

当我浏览目前的PowerShell问题时,我偶然发现: How to dynamically create an array and use it in 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

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

抱歉..现在我看起来没有研究和谷歌搜索:/偶然发现了答案。 谢谢Andi Arismendi