我如何拥有父脚本,但保持与Powershell脚本的关注点分离?

时间:2011-12-20 18:23:05

标签: powershell powershell-module

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

- Create Site
- Create App Pool
- Create Virtual directories

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

我不知道如何处理这样的问题:每个脚本都有一个将从用户那里获取信息的脚本体,但是如果它被加载到父脚本中,则避免该特定的脚本脚本体提示用户。

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

我不熟悉使用Powershell编写脚本,有任何想法或建议吗?

可能的答案*

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

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

3 个答案:

答案 0 :(得分: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
    }
}

答案 1 :(得分:2)

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

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

param
(
    [parameter(Mandatory=$true, HelpMessage="This is required, please enter a value.")]
    [string] $SomeParameter
)

答案 2 :(得分:1)

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

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

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

希望这有助于