其中是放置PowerShell脚本版本号的标准位置

本文关键字:版本号 标准 位置 脚本 PowerShell | 更新日期: 2023-09-27 17:58:25

自PowerShell版本3以来,出现了定义良好的基于注释的帮助注释块:https://technet.microsoft.com/en-us/library/hh847834.aspx我想知道的是,是否有一个像C#中那样对PowerShell脚本进行版本控制的标准?我正在询问,因为我即将发布一个模块和psd1文件有:

# Version number of this module.
ModuleVersion = '1.0.0.0' 

在我自己的脚本中,我使用以下标准:

<#  
.SYNOPSIS  
    <Synopsis goes here>.
.DESCRIPTION
    <Description goes here>.
.EXAMPLE
    Example.ps1
    Runs with default parameters
.NOTES  
    Author     : Glen Buktenica
    Version    : 1.0.0.0 20160725 Initial Build  
#> 

其中是放置PowerShell脚本版本号的标准位置

在撰写本文(并提出问题)时-Afaik没有这样做的"官方"标准。

我见过人们对脚本进行版本控制的最常用的方法是在。NOTES部分

.NOTES
  Version:        1.0
  Author:         <Name>
  Creation Date:  <Date>
  Purpose/Change: Initial script development

在#requires语句之后,我还在脚本顶部看到了这样的标题。例如:#script 1.0-尽管频率较低

由于这是元信息,您的脚本版本将遵循您的模块版本,我认为这应该是一个很好的解决方案,可以继续做您已经在做的事情(以及我看到的大多数人已经在做)。

更新:有关Powershell的较新版本,请查看新的scriptfileinfo cmdlet:(https://learn.microsoft.com/en-us/powershell/module/powershellget/new-scriptfileinfo?view=powershell-6)

使用ScriptFileInfo cmdlet,如:New-ScriptFileInfo

<#PSScriptInfo
.VERSION 1.0.1
.GUID 54688e75-298c-4d4b-a2d0-1234567890ab
.AUTHOR iRon
.DESCRIPTION Your description
.COMPANYNAME
.COPYRIGHT
.TAGS PowerShell Version
.LICENSEURI https://github.com/LICENSE
.PROJECTURI https://github.com/
.ICONURI https://Icon.png
.EXTERNALMODULEDEPENDENCIES
.REQUIREDSCRIPTS
.EXTERNALSCRIPTDEPENDENCIES
.RELEASENOTES
.PRIVATEDATA
#>

很遗憾,这并没有标准化,因为它将打开一种从您自己的代码中获取可访问信息的方法。例如,如果要将版本记录在日志文件中,则不希望在cmdlet中的另一个命令中重新定义该版本(因为它可能会被遗忘并与标头不同步)。

在我的标准PowerShell LOg-Entry框架中,我使用了一些命令来使此程序集信息在默认情况下易于使用:

$My = @{File = Get-ChildItem $MyInvocation.MyCommand.Path; Contents = $MyInvocation.MyCommand.ScriptContents}
If ($My.Contents -Match '^'s*'<#(['s'S]*?)#'>') {$My.Help = $Matches[1].Trim()}
[RegEx]::Matches($My.Help, '(^|['r'n])'s*'.(.+)'s*['r'n]|$') | ForEach {
    If ($Caption) {$My.$Caption = $My.Help.SubString($Start, $_.Index - $Start)}
    $Caption = $_.Groups[2].ToString().Trim()
    $Start = $_.Index + $_.Length
}
$My.Title = $My.Synopsis.Trim().Split("`r`n")[0].Trim()
$My.Notes -Split("'r'n") | ForEach {$Note = $_ -Split(":", 2); If ($Note[0].Trim()) {$My[$Note[0].Trim()] = $Note[1].Trim()}}
$My.Path = $My.File.FullName; $My.Folder = $My.File.DirectoryName; $My.Name = $My.File.BaseName
$My.Arguments = (($MyInvocation.Line + " ") -Replace ("^.*''" + $My.File.Name.Replace(".", "'.") + "['"" ]"), "").Trim()

$My对象示例:

Name                           Value
----                           -----
DESCRIPTION                        <Description goes here>.
EXAMPLE                            Example.ps1...
Name                           My
Folder                         C:'Users'User'Scripts'Test'PowerShell
Version                        1.0.0.0 20160725 Initial Build
Author                         Glen Buktenica
NOTES                              Author     : Glen Buktenica...
File                           C:'Users'User'Scripts'Test'PowerShell'My.ps1
Title                          <Synopsis goes here>.
Arguments                      -test
SYNOPSIS                           <Synopsis goes here>.
Path                           C:'Users'User'Scripts'Test'PowerShell'My.ps1
Contents                       <#  ...
Help                           .SYNOPSIS  ...

假设NOTES部分如下所示:

.NOTES
Version    : 1.6.2
Author     : Mary Doe
Created on : 2019-02-06
License    : MIT License
Copyright  : (c) 2019 Mary Doe

您可以借助以下函数将注释记录转换为哈希表变量:

function GetVersionInfo {
    $notes = $null
    $notes = @{}
    # Get the .NOTES section of the script header comment.
    $notesText = (Get-Help -Full $PSCommandPath).alertSet.alert.Text
    # Split the .NOTES section by lines.
    $lines = ($notesText -split ''r?'n').Trim()
    # Iterate through every line.
    foreach ($line in $lines) {
        if (!$line) {
            continue
        }
        $name  = $null
        $value = $null
        # Split line by the first colon (:) character.
        if ($line.Contains(':')) {
            $nameValue = $null
            $nameValue = @()
            $nameValue = ($line -split ':',2).Trim()
            $name = $nameValue[0]
            if ($name) {
                $value = $nameValue[1]
                if ($value) {
                    $value = $value.Trim()
                }
                if (!($notes.ContainsKey($name))) {
                    $notes.Add($name, $value)
                }
            }
        }
    }
    return $notes
}

现在,你可以得到这样的版本

$versionInfo = GetVersionInfo
$versionInfo["Version"]

只需记住遵守关于标头要求的帮助(必须至少有一行空行,必须在脚本顶部,等等);否则,它将不起作用。此外,该函数假定注释条目是带有冒号(:)字符分隔符的单行。