Sun*_*une 8 powershell function
我有一个大脚本,我现在正在使用函数进行清理.但是,我发现将它们放在脚本的顶部会变得有点混乱.我必须滚动过去几百行代码才能进入脚本本身..
你们怎么保持脚本整洁?你的功能是否在一个单独的文件中?
And*_*ndi 13
如果您使用PowerGUI脚本编辑器,您可以使用以下区域:
#region Set of functions A
function foo {
Write-Host "Just a function"
}
function bar {
return "Just another function"
}
#endregion
Run Code Online (Sandbox Code Playgroud)
在PowerGUI脚本编辑器中打开脚本时,区域将折叠,因此您无需滚动即可转到主逻辑.这也适用于Microsoft ISE.但并非所有脚本编辑都尊重区域标签.
另一种方法是将您的函数外部化到另一个脚本中并执行所谓的点源. C:\myfunctions.ps1或将它们放在以.psm1扩展名和命名命名的模块文件中Import-Module.
一种有用的技术是将整个脚本放在一个函数中:
#!/bin/sh
main()
{
# The majority of the code is here
}
foo()
{
# auxiliary functions go here
}
main "$@" # invoke the main function
Run Code Online (Sandbox Code Playgroud)
我刚刚注意到这个问题被标记了powershell,而上面的例子是针对Bourne的.该技术可能有效,但语法可能不同.
小智 8
我们采用的技术是通过脚本模块加载所有函数.我们创建了一个文件夹来保存所有单个函数文件,并进一步将它们细分为适当的类别.完成后我们创建一个.psm1文件来告诉模块要加载什么,然后将模块路径添加到我们的PowerShell配置文件中(如果不在默认的模块位置).
Module-Name\
Subfolder1\
Subfolder2\
...
Module-Name.psm1
Run Code Online (Sandbox Code Playgroud)
Module-Name.psm1(位于具有相同名称的文件夹下 - 必需)
# Script Module for Company Functions
Function Get-ScriptDirectory {
# $MyInvocation is an Automatic variable that contains runtime details and
# we can use this to get information about where the file is run from.
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
Split-Path $Invocation.MyCommand.Path
}
Get-ChildItem (Get-ScriptDirectory) -Recurse `
| Where-Object { $_.Name -like "func_*" } `
| %{
. $_.FullName
}
Run Code Online (Sandbox Code Playgroud)
Microsoft.PowershellISE_profile.ps1/Microsoft.Powershell_profile.ps1
$LocalLibraries = "C:\Local\Path\On\Disk\"
$env:PSModulePath = $env:PSModulePath + ";$LocalLibraries"
Run Code Online (Sandbox Code Playgroud)
上面的代码意味着您不必将模块存储在与其余模块相同的位置(在我们的情况下很有用,因为我们使用SVN来版本并与我们的团队共享我们的东西).
回顾一下:
我们在"ps1"文件前加上"func_"前缀,这样当tab完成函数名称时,如果在与文件相同的目录中,它就不会混淆.另外,我们在前面添加Namespace(公司名称缩写等),以便我们的函数名称不会与任何其他添加的函数发生冲突.
在开发过程中可能会派上用场的另一个有用的提示是在我们的例子中定义一个别名"reload",这会强制模块重新加载.这意味着一旦你更改了一个文件,你所要做的就是键入它,然后你的更改将再次点源到内存中.
# Function to reload Module
Function int_ModuleNameModuleLoad {
Import-Module Module-Name -Force -WarningAction SilentlyContinue
Write-Host "Module-Name Reloaded"
}
# Set Aliases
If (-not(Get-Alias "reload" -ErrorAction SilentlyContinue)) {
New-Alias -Name reload -Value int_ModuleNameModuleLoad -Force
}
Run Code Online (Sandbox Code Playgroud)
我使用"int_"而不是我们正常的命名结构的原因是,这个函数位于我们的配置文件中,我认为它是内部的而不是完整的功能.
我希望这会给你一些好主意,到目前为止它对我们来说效果很好!
-亚当
| 归档时间: |
|
| 查看次数: |
13366 次 |
| 最近记录: |