为什么= =符号之后的参数$ args没有扩展? ($ args作为jvm典型-D开关的参数)

时间:2015-04-10 07:32:24

标签: powershell escaping powershell-v2.0

我在* profile.ps1文件中有以下定义:

if(Test-Path $env:M2_HOME){
    function mvn{
            $cmd = "$env:M2_HOME\bin\mvn.bat"
            & $cmd $args
    }
}

当我在powershell中使用此函数定义函数时,如:

function d { mvn help:describe $args }

使用like:

d -Dplugin=jar

一切都很好,而不是将后者定义为:

function d { mvn help:describe -Dplugin=$args }

使用like:

d jar

是否有一些内置处理这个角落的情况?

3 个答案:

答案 0 :(得分:1)

通过调用函数获取参数你应该像这样使用

function test {
write-host $args[0]
write-host $args[1]
}

test stackoverflow powershell

输出

stackoverflow
powershell

stackoverflow first argument传递给函数,powershell传递给函数second argument 对于传递给函数的每个参数

function test {
foreach ($a in $args){
write-host "output:$args"
}
}

测试1 2 3 4 5 6 7 8

输出:

test 1 2 3 4 5 6 7 8 
output:1 2 3 4 5 6 7 8
output:1 2 3 4 5 6 7 8
output:1 2 3 4 5 6 7 8
output:1 2 3 4 5 6 7 8
output:1 2 3 4 5 6 7 8
output:1 2 3 4 5 6 7 8
output:1 2 3 4 5 6 7 8
output:1 2 3 4 5 6 7 8

为您的功能

 if(Test-Path $env:M2_HOME){
        function mvn{
                $cmd = "$env:M2_HOME\bin\mvn.bat"
foreach ($arg in $args) {

                & $cmd $args}
        }
    }

答案 1 :(得分:1)

看起来您只需要确保将参数作为字符串传递并确保首先评估它们:

function mvn{
  $cmd = "$env:M2_HOME\bin\mvn.bat"
  & $cmd $args
}

function d { mvn "help:describe" "-Dplugin=$($args)" }

答案 2 :(得分:0)

有人似乎已经a similar observation: 原因似乎-D是powershell中的一个特殊字符,或多或少标记了由-D确定的每个特定选项字符串的确切位置,至少对我的调用函数的这种修改对我有效:

function x {mvn help:describe `-Dplugin=$args}

当然,以某种方式处理托管功能中的这种情况会很好(我的* profile.ps1中的mvn定义),但这些解决方案似乎超出了我的问题的范围。