【问题标题】:How to pass arguments to an inline script in PowerShell?如何将参数传递给 PowerShell 中的内联脚本?
【发布时间】:2016-02-24 10:04:16
【问题描述】:

我是 PowerShell 脚本的新手。我想知道是否有一种方法可以在不创建新的.ps1 文件并将参数传递给它的情况下调用内联脚本,例如

powershell -command "echo `$args[0]" 123 456

我希望 echo $args[0] 成为脚本,123 456 成为参数,但 PowerShell 似乎将 123 456 解释为脚本的一部分(好像我写了 "echo `$args[0] 123 456")并打印

123
456

是否可以在不在磁盘上创建新的 PowerShell 脚本的情况下解决此问题?

【问题讨论】:

  • 您可以在 PowerShell 中执行 powershell.exe -command {echo $args[0]} -args 123,456
  • 是什么引发了这个问题?

标签: windows shell powershell scripting eval


【解决方案1】:

这就是我认为你想要的:

powershell -command "& {write-host `$args[0] - `$args[1] - `$args[2]}" 123 456 789

$args 数组的每个元素都是不同的参数,因此要访问三个参数,您需要 $args[0]、$args[1] 和 $args[2]。

您还可以使用 param 语句并获取命名参数:

powershell -command "& {param(`$x,`$y); write-host `$x - `$y}" -x 123 -y 456

【讨论】:

    【解决方案2】:

    到目前为止,您已经看到了几个答案和 cmets,它们向您展示了如何按照您的要求去做。但我必须回应@BillStewart 的评论:你的真正目的是什么?

    如果要能够执行字符串中的任意 PowerShell,您当然可以调用 powershell.exe,正如您在几个答案和 cmets 中看到的那样。但是,如果您这样做,请务必包含 -noprofile 参数以提高效率。为了提高效率,您可以使用Invoke-Command,而无需启动整个单独的 PowerShell 环境,例如

    Invoke-Command -ScriptBlock ([Scriptblock]::Create('echo $args[0]')) -arg 123, 456
    

    另一方面,如果您想要执行一大块 PowerShell(不是 在一个字符串中,但出于某种原因只是在您的脚本中分开),您可以简化为:

    Invoke-Command -ScriptBlock {echo $args[0]} -arg 123, 456
    

    不过,只要您有选择,避免将字符串作为可执行代码进行操作(在任何语言中)!在 Powershell 中执行此操作的常用方法是使用 Invoke-Expression,我提到它为您指出启发性文章 Invoke-Expression considered harmful

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 2020-11-19
      • 2013-04-27
      • 2013-11-24
      • 2015-06-07
      • 2017-05-08
      • 2019-07-07
      相关资源
      最近更新 更多