3

我有六个具有相关功能的 powershell 脚本(.ps1 文件)。有没有一种简单的方法可以将它们组合成一个模块,以便我可以像普通 CmdLets 一样调用它们?

例如,而不是运行:

PS> ./get-somedata.ps1 -myParams x

我可以导入模块并编写:

PS> get-somedata -myParams x
4

3 回答 3

2

您应该创建一个脚本模块。首先,把你的脚本变成函数(这样你可以.\在调用它们时跳过)。这就像将脚本内容包装在函数脚本块中一样简单。前任。

获取一些数据.ps1

$data = get-childitem -filter *.doc
$data | ft -autosize

变成了。

获取一些数据.ps1

function get-somedata {
    $data = get-childitem -filter *.doc
    $data | ft -autosize
}

然后,您可以创建一个包含所有新函数的 *.psm1 文件,或者创建一个运行单独脚本的 *.psm1 文件(因为它们现在包装在函数脚本块中,函数将被导入而不是在运行时运行脚本文件)。如果您想对名称、文件列表、版本等进行更多控制,您可以创建一个模块清单。上面的链接解释了其中一些。

看看这个链接

于 2013-05-16T21:27:52.570 回答
1

好吧,我想做同样的事情,不想创建一个庞大的模块文件。(因为我经常编辑我的文件)

所以这就是我所做的。丑陋但效果很好!完成是几秒钟。

$Module = c:\users\<username>\documents\windowspowershell\module\mycustommodule\mycustommodule.psm1
#Added so when I make changes to scripts I can easily rebuild the module file.
Clear-content $module

$Scripts = c:\<scriptfolder>
$FileList = gci $Scripts

foreach ($File in $FIleList) 
{   $name = $File.basename
    $OpenFunction = "`n`n`n`n Function $Name { `n"
    $CloseFunction = "`n}"
    add-content $openfunction -path $module    
    $File | get-content | add-content -path $module
    add-content $closefunction -path $module
}

现在你可以 import-module mycustommodule

并调用与原始脚本同名的函数之一。:-)

于 2013-10-05T22:01:30.990 回答
1

有几种选择。

将脚本放在 $env:Path 的文件夹中,或将脚本文件夹添加到 $env:Path。您也不需要指定 .ps1

将您的脚本转换为函数并将它们添加到您的配置文件脚本 ($profile)。此脚本在 powershell 启动时运行。您还可以使用配置文件中的函数对脚本进行点源。

将您的脚本转换为函数并将它们添加到模块中。不要忘记在使用前导入你的模块。您可以在您的 powershell 配置文件中执行此操作,因此每次启动 powershell 时都会执行此操作。或者使用可以自动加载模块的 powershell v3。然后确保您的模块位于$PSModulePath的文件夹之一中。

于 2013-05-16T21:36:07.050 回答