2

我有一个包装器 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”参数在我的脚本中运行?如果我只是在脚本中包含该值而不是将其作为参数传递它运行没有任何问题...

4

1 回答 1

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

于 2012-07-19T23:27:49.660 回答