如何在PowerShell中将参数传递给内联脚本?

时间:2015-11-22 04:54:38

标签: windows shell powershell scripting eval

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

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

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

"echo `$args[0] 123 456"

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

2 个答案:

答案 0 :(得分:1)

到目前为止,您已经看到了几个答案和评论,告诉您如何做到您所要求的。但我必须回应@BillStewart的评论:你的真正目的是什么?

如果能够执行字符串中的某些任意PowerShell,您当然可以调用powershell.exe,正如您在几个答案和注释中看到的那样。但是,如果这样做,请务必包含-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

答案 1 :(得分:0)

这就是我想你想要的:

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