Powershell 为什么参数$args after=sign不能展开?($args作为jvm典型-D开关的参数)

Powershell 为什么参数$args after=sign不能展开?($args作为jvm典型-D开关的参数),powershell,escaping,powershell-2.0,Powershell,Escaping,Powershell 2.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 d

我的*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
d jar
一切都很好,而不是将后者定义为:

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

d -Dplugin=jar
d jar

是否有一些内置函数来处理这种情况?

对于通过调用获取参数的函数,您应该这样使用

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

test stackoverflow powershell
输出

stackoverflow
powershell
stackoverflow
第一个参数
传递给函数的,而
powershell
第二个参数
传递给函数的 对于传递给函数的每个参数

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

输出:

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}
        }
    }

似乎有人提出: 原因似乎是
-D
是powershell中的一个特殊字符,或多或少标记了由
-D
确定的每个特殊选项字符串的结束位置,至少对调用函数的此修改对我有效:

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

当然,在宿主函数中以某种方式处理此类情况会很好(
mvn
myprofile.ps1中的定义),但解决方案似乎超出了我的问题范围。

看起来您只需要确保将参数作为字符串传递,并确保首先对其求值:

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

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

我需要将所有参数传递给函数。daniel post编辑的测试循环
foreach
对于传递给函数的所有参数,她感谢您提供的
编写主机
提示,验证
$args
是否未展开对我非常有用。。。现在让我惊讶的是,我最终发现有人也有类似的问题,请看下面我的答案。