【问题标题】:Passing in $args variable to function将 $args 变量传递给函数
【发布时间】:2018-11-09 12:39:44
【问题描述】:

我有一个脚本tester.ps1;它所做的第一件事是调用一个名为main 的函数(在脚本本身中定义)。

我需要传入从命令行传入it的自动变量$args

我该怎么做?

以下似乎不起作用:

#Requires -Version 5.0
#scriptname: tester.ps1
function main($args) {
    Write-Host $args
}
# Entry point
main $args

当我保存这个tester.ps1并调用它时,函数看不到传入的参数?

PS>。 .\tester.ps1 你好世界 从入口点:你好世界 从功能:

【问题讨论】:

  • 不要将$args 定义为函数中的参数:function main {write-host $args }
  • 不能使用$args作为实参;它已经是一个特殊的值,它始终包含函数的所有参数。在这种情况下,只需将其设为main() 就足够了。 (仍然需要将$args 传递给它。)如果您有许多需要访问所有函数的函数,则将$args 保存在全局变量中的函数之外是另一种选择。
  • 谢谢 - 但是如何“存储”我调用脚本时设置的 $args 的副本。以这种方式构造我的脚本(使用“主”函数)的一个原因是尽量避免将变量污染回调用环境......
  • 知道了:我刚刚将函数参数重命名为“my_args”。

标签: powershell scripting powershell-5.0


【解决方案1】:

在您的示例中,只需从 main 函数声明中删除 $args 就足以获得您想要的输出。

不过,请注意,如果要按名称传递参数,则需要调用 main 并使用 splatting 运算符 @,例如:

#Requires -Version 5.0
#scriptname: tester.ps1
function main($myString, $otherVar) {
    Write-Host $myString
}
# Entry point
Write-Host "Not using splatting: " -NoNewline
main $args

Write-Host "Using splatting: " -NoNewline
main @args

输出:

PS> . .\test.ps1 -myString "Hi World" -otherVar foobar
Not using splatting: -myString Hi World -otherVar foobar
Using splatting: Hi World

了解更多关于喷溅操作符@here

【讨论】:

    【解决方案2】:

    基于 Jeroen Mostert 的评论*;解决方案如下。 基本上我错误地试图“重载”或“隐藏”内置的 $arg 变量。 我只需要一个具有不同名称的参数,如下所示:

     #Requires -Version 5.0
        function main($my_args) {
            write-host "From Function:" $my_args 
        }
        # Entry point
        write-host "From entry point:" $args
        main $args
    
    > . .\tester.ps1 hello world
    From entry point: hello world
    From Function: hello world
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2011-01-18
      相关资源
      最近更新 更多