我怎样才能在同一个脚本文件中使用一个函数,而不会让$ args最终引用为i。即“arg1 arg2”

时间:2015-04-24 09:52:46

标签: maven powershell maven-3 powershell-v2.0

我有一个powershell(v2.0)函数:

function mvn{
    param(
        [parameter(Position=0, ValueFromRemainingArguments=$true)]
        $args
    )
    <# calling the realmaven.bat file here with the args #>
    "$env:M2_HOME\bin\mvn.bat" $args
}

现在我想使用前者在此脚本文件中使用另一个函数:

function mvn-failsafe-debug {
    param (
        [string] $Dmaven_failsafe_debug="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_shmem,server=y,address=Maven,suspend=n",
        [parameter(Position=0, ValueFromRemainingArguments=$true)]
        $args
    )
    <# 
       calling the predefined mvn function above
    #>
    mvn `-Dmaven.failsafe.debug=$Dmaven_failsafe_debug $args
}

现在在powershell提示符上使用mvn-failsafe-debug clean install时生成的命令类似于:

  

realmaven.bat ...“干净安装”

但我需要它

  

realmaven.bat ...清理安装

如何实现?

3 个答案:

答案 0 :(得分:1)

不确定这是否是您遇到困难的全部原因,但对于初学者来说,不要将变量命名为$args。这是PowerShell中的自动变量。您可以查看about_Automatic_Variables以了解我的意思。

如果没有别的,你应该在param重命名该行。我只是将变量名称更改为$remains

在同样的方面,您可以将调用函数更改为类似的内容。

function mvn{
    param(
        [parameter(Position=0, ValueFromRemainingArguments=$true)]
        $remains
    )
    Write-Host $remains
    Start-Process "$($env:M2_HOME)\bin\mvn.bat" -ArgumentList ($remains -join "")
}

答案 1 :(得分:1)

您有两种选择。您可以使用参数数组而不是字符串调用function mvn,也可以拆分字符串。

因此,要么保持原样并使用

mvn-failsafe-debug clean, install

或将其更改为

function mvn {
    param(
        [parameter(Position=0)]
        [string] $arguments
    )

    Start-Process "$($env:M2_HOME)\bin\mvn.bat" -ArgumentList ($arguments -split " ")
}

答案 2 :(得分:0)

@Swoogan,你的$(arguments -split " ")终于给了我需要的东西。

为了理解我现在使用的解决方案如下所示(作为一个简单的用例mvn-eval作为一个更复杂的mvn-surefire-debug):

function mvn {
 param(
  [parameter(Position=0)]
  [string] $arguments
 )
 & "$($env:M2_HOME)\bin\mvn.bat" ($arguments -split " ")
}

function mvn-eval {
 param (
  [string] $Dexpression="basedir",
  [parameter(Position=0, ValueFromRemainingArguments=$true)]
  $args
 )
 mvn "help:evaluate $args"
}

function mvn-surefire-debug {
 param (
    [string] $Dmaven_surefire_debug="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_shmem,server=y,address=Maven,suspend=n"
  , [parameter(Position=0, ValueFromRemainingArguments=$true)]
  $remains
 )
 mvn """`-Dmaven.surefire.debug=$Dmaven_surefire_debug"" $remains"
}