Powershell 为什么参数$args after=sign不能展开?($args作为jvm典型-D开关的参数)
我的*profile.ps1文件中有以下定义: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
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
是否未展开对我非常有用。。。现在让我惊讶的是,我最终发现有人也有类似的问题,请看下面我的答案。