执行传递给powershell脚本的参数,就好像它是脚本中的一行一样

时间:2012-07-19 22:47:02

标签: powershell

我有一个包装程序PowerShell脚本,我希望用它来自动化一些东西。它非常基本,并且接受一个我希望脚本运行的参数,就好像它是脚本中的一行一样。我绝对不能让它工作。

示例:

param( [string[]] $p)
echo $p
# Adds the base cmdlets
Add-PSSnapin VMware.VimAutomation.Core
# Add the following if you want to do things with Update Manager
Add-PSSnapin VMware.VumAutomation
# This script adds some helper functions and sets the appearance. You can pick and choose parts of this file for a fully custom appearance.
. "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-VIToolkitEnvironment.ps1"

$p

在上面的示例中,我希望$ p执行,就好像它是脚本中的一行一样。我知道这不安全,而这可能就是问题所在。

以下是我尝试运行脚本并传入$ p参数的方法:

D:\ps\test>powershell -command "D:\ps\test\powershell_wrapper.ps1" 'Suspend-VM servername -Verbose -Confirm:$False'

如何在我的脚本中运行'Suspend-VM servername -Verbose -Confirm:$ False'参数?如果我只是在脚本中包含该值而不是将其作为参数传递,则它运行时没有任何问题......

1 个答案:

答案 0 :(得分:3)

您基本上可以采用这两种方式,具体取决于您的需求以及您希望如何构建代码。

方法#1 - 调用表达式

Invoke-Expression基本上允许您将字符串视为表达式并对其进行评估。考虑以下简单的例子:

Invoke-Expression '{"Hello World"}'

这会将字符串计算为直接输入的表达式,并将字符串“Hello World”放在管道上。您可以使用它来获取字符串参数并在脚本中即时运行它。

方法#2 - 使用ScriptBlock

PowerShell有一种称为ScriptBlock的特殊数据类型,您可以在其中将脚本绑定到变量,然后在代码中调用该脚本。同样,这是一个简单的例子:

function Test-SB([ScriptBlock]$sb) {
  $sb.Invoke()
}

Test-SB -sb {"Hello World"}

此示例使用单个参数$ sb创建一个函数,该函数的类型为ScriptBlock。请注意,参数绑定到实际的代码块{"Hello World"}?该代码分配给$ sb参数,然后对.Invoke方法的调用实际执行代码。您可以调整代码以接收ScriptBlock并将其作为脚本的一部分进行调用。

方法#3 - 更新个人资料

好的,所以我说有两种方法可以接近它。实际上有三分之一......你可以将VMWare cmdlet添加到$profile,这样它们总是存在,你不需要你的包装器加载到这些库中。当然,这是一个相当大的锤子 - 但如果这是你经常工作的环境,它可能是有意义的。你也可以创建一个PowerShell的快捷方式,它在启动时运行.ps1,包括那些库并挂起(这个是MS对SharePoint管理外壳和其他几个人所做的事情)。请查看此TechNet页面以获取有关$ profile的更多信息,以及它是否可以帮助您:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb613488.aspx