什么是PowerShell相当于cmd中的“%*”?

时间:2017-12-13 21:38:09

标签: powershell batch-file cmd scripting

如何在powershell函数中编写以下cmd脚本:

@echo off
C:\bin\command.exe %*

Powershell脚本:

function f{
    [CmdletBinding()] Param()
    # .. Code? ...
}

3 个答案:

答案 0 :(得分:4)

如果要定义param块并仍然捕获所有参数,则可以定义使用ValueFromRemainingArguments属性上的Parameter参数的参数。

function Test-Function {
    [CmdletBinding()]
    param(
        [string] $FirstParameter,

        [Parameter(ValueFromRemainingArguments=$true)]
        [object[]] $RemainingArguments
    )
    end {
        $PSBoundParameters
    }
}

Test-Function first and then the rest go to remaining

# Key                Value
# ---                -----
# FirstParameter     first
# RemainingArguments {and, then, the, rest...}

答案 1 :(得分:3)

使用Param()定义,您不能拥有未绑定的参数(编辑:除非您定义一个参数来捕获所有未绑定的参数,如他的答案中所指出的Patrick Meinecke) 。传递给函数的所有参数必须在Param()块中有一个定义,否则PowerShell将抛出InvalidArgument异常。然后,这些参数列在字典$MyInvocation.BoundParameters中。

如果没有Param()定义,函数的所有参数都会列在自动变量$args中(以及$MyInvocation.UnboundArguments中)。

答案 2 :(得分:1)

重复的帖子提供了很好的参考,但没有直接回答手头的问题。

  1. 将批次与PS进行比较: PShell提供了更多的命令行信息,因为它基于对象。

  2. 这个等式可以简化事情。

    a = [105 97 245 163 207 134 218 199 160 196 221 154 228 131 180 178 157 151 ...
         175 201 183 153 174 154 190 76 101 142 149 200 186 174 199 115 193 167 ...
         171 163 87 176 121 120 181 160 194 184 165 145 160 150 181 168 158 208 ...
         133 135 172 171 237 170 180 167 176 158 156 229 158 148 150 118 143 141 ...
         110 133 123 146 169 158 135 149];
    
    mean = mean(a)
    std = std(a)
    max = max(a)
    min = min(a)
    range = range(a)
    
  3. %*将匹配绑定或未绑定参数。由于您有一个空的参数(),您将使用未绑定。

    $MyInvocation.line           =
    $MyInvocation.InvocationName +
    $MyInvocation.MyCommand      +
    [$MyInvocation.BoundParameters | $MyInvocation.UnboundArguments ] 
    
    
    $MyInvocation.line             entire string used to invoke script or 
                                    function.
     $MyInvocation.InvocationName   if present could be & (Call) or . (DotSource)
     $MyInvocation.MyCommand        Name of the script.
     $MyInvocation.BoundParameters  Variables in the param () parentheses.
     $MyInvocation.UnboundArguments Command-Line variables not in parentheses.
    

    来源

    1. How to get all arguments passed to function (vs. optional only $args)

    2. PowerShell CommandLine帮助about_automatic_variables