在 PS1 脚本中调用脚本后引用文本

Referencing text after script is called within PS1 Script

下面以PowerShell语句为例:

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

是否可以在 windowsbroker.ps1 中编写脚本来检查 IIS 字符串,以及它是否存在以执行特定的安装脚本?代理脚本旨在根据调用它时跟随的字符串安装不同的应用程序。

这似乎是一个奇怪的问题,但我一直在使用 CloudFormation 启动应用程序环境,并且我指定了一个 "ApplicationStack" 参数,当 powershell 脚本是 运行 所以它知道哪个脚本 运行 在启动期间安装正确的应用程序。

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

Param(
  [string]$appToInstall
)

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

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

您正在尝试做的是参数或参数处理。 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> <b>Get-Help windowsbroker.ps1</b>
windowsbroker.ps1 [-IIS]

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

除此之外,使用参数还有很多其他优势(尽管它们在您的场景中可能用处不大)。您可以执行参数验证、强制参数、定义默认值、从管道读取值、通过参数集使参数依赖于其他参数等。有关详细信息,请参阅 here and here