在PS1脚本

时间:2015-12-15 20:31:53

标签: powershell amazon-cloudformation

我们以下面的PowerShell声明为例:

powershell.exe c:\temp\windowsbroker.ps1 IIS

是否可以在windowsbroker.ps1内编写脚本以检查该IIS字符串,以及是否存在以执行特定的安装脚本?代理脚本用于安装不同的应用程序,具体取决于调用它时跟随它的字符串。

这似乎是一个奇怪的问题,但我一直在使用CloudFormation来启动应用程序环境,我正在指定一个“ApplicationStack”参数,该参数将在运行powershell脚本时被引用,因此它知道哪个在启动期间运行以安装正确应用程序的脚本。

2 个答案:

答案 0 :(得分:3)

您尝试做的事情称为参数或参数处理。在最简单的形式中,PowerShell为automatic variable $args中的脚本提供了所有参数。这将允许您检查参数IIS,如下所示:

if ($args -contains 'iis') {
  # do something
}

或者像这样,如果你想让支票区分大小写(我不建议这样做,因为Windows和PowerShell通常都不是):

if ($args -ccontains 'IIS') {
  # do something
}

但是,由于显然您希望将参数用作触发器来触发脚本的特定行为,因此有更好,更复杂的方法来执行此操作。您可以在脚本顶部添加Param()部分,并检查参数是否存在于此类参数中(有关要安装的事项列表):

Param(
  [Parameter()]
  [string[]]$Install
)

$Install | ForEach-Object {
  switch ($_) {
    'IIS' {
      # do something
    }
    ...
  }
}

或像这样(对于单个选项):

Param(
  [switch]$IIS
)

if ($IIS.IsPresent) {
  # do something
}

您可以像这样运行脚本:

powershell "c:\temp\windowsbroker.ps1" -Install "IIS",...

或者分别喜欢这样:

powershell "c:\temp\windowsbroker.ps1" -IIS

通常我更喜欢使用数组参数切换参数(除非你有一个相当广泛的选项列表),因为后者你必须担心数组元素的拼写,而使用开关你需要构建 - 拼写检查。

使用Param()部分还会自动为您的脚本添加简短的使用说明:

PS C:\temp> Get-Help windowsbroker.ps1
windowsbroker.ps1 [-IIS]

您可以通过comment-based help进一步增强对此脚本的在线帮助。

使用参数还有很多其他优点(即使它们在你的场景中可能没有那么多用)。您可以执行参数验证,强制参数,定义默认值,从管道读取值,通过参数集使参数依赖于其他参数,等等。有关详细信息,请参阅herehere

答案 1 :(得分:0)

是的,它们被称为位置参数。您可以在脚本开头提供参数:

Param(
  [string]$appToInstall
)

然后您可以按如下方式编写脚本:

switch ($appToInstall){ 
    "IIS" {"Install IIS here"} 
}