1

因此,我正在为产品专用的特定 IIS 站点设置编写一些 IIS 管理脚本,以完成以下任务:

- Create Site
- Create App Pool
- Create Virtual directories

问题是我想为每个关注点保留单独的脚本并在父脚本中引用它们。可以运行父脚本来进行完整的部署/设置。或者,您可以为特定任务运行各个脚本。问题是它们是交互式的,因此它们会请求与完成任务相关的用户信息。

我不知道如何解决每个脚本都会有一个脚本主体从用户那里获取信息的问题,但是如果它被加载到父脚本中,请避免该特定脚本的脚本主体提示用户。

注意:我知道我可以将它们放入模块中,并启动单独的“导出到环境”功能,但是这个脚本将被移动到需要设置的环境中,并且必须手动放置模块 (psm1) 文件进入适当的 PowerShell 模块文件夹只是为了运行脚本是我不是特别喜欢的方法。

我是使用 Powershell 编写脚本的新手,有什么想法或建议吗?

可能的答案*

这可能是(a)解决方案:但我发现我可以从工作目录中导入模块,并且可以从那里访问那些导出的函数。

我也对任何其他建议感兴趣。

4

3 回答 3

2

您可以拥有一个deploy.ps1脚本,它为各个脚本提供点源,然后在其中调用必要的函数:

. $scriptDir\create-site.ps1
. $scriptDir\create-apppool.ps1
. $scriptDir\create-virtualdirectories.ps1

Prompt-Values

Create-Site -site test
Create-AppPool -pool test
Create-VirtualDirectories -vd test

在各个函数中,您可以查看所需的值是否从调用者( deploy.ps1 或命令行)传入

例如,create-site.ps1 将类似于:

function Create-Site($site){
    if(-not $site){
         Prompt-Values
    }
}
于 2011-12-20T18:42:06.030 回答
2

他们解决这个问题的方法是在每个子脚本的顶部实现一个参数块,该块将收集它需要运行的信息。如果单独运行子脚本,则参数块将提示用户输入运行该单独脚本所需的数据。这也允许父脚本在父脚本调用子脚本时传递运行下标所需的数据。所需的数据可以在父脚本中硬编码或提示输入或混合使用。这样,您可以使子脚本以静默方式或与用户交互方式运行。您可以从 Powershell 的参数处理机制中免费获得用户交互。在下标中添加一个参数属性以指示 Powershell 将向用户请求这些特定参数值,如果它们尚未由调用脚本提供。

在子脚本的顶部,使用参数块来收集所需的数据。

param
(
    [parameter(Mandatory=$true, HelpMessage="This is required, please enter a value.")]
    [string] $SomeParameter
)
于 2011-12-21T14:25:35.590 回答
1

理想的情况是让模块负责维护存储它自己的设置,这取决于该模块的分布问题,并制作命令来帮助处理这些设置。

IE

编写一个 Set-SiteInfo -Name -Pool -VirtualDirectory 并将其存储在注册表或模块的本地目录($psScriptRoot)中,然后让模块中的其他命令使用它。

如果模块被放置在对低权限用户没有文件写入访问权限的位置(即网站目录或 $psHome),那么将值存储在注册表中会更好。

希望这可以帮助

于 2011-12-21T02:01:26.460 回答