当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 周五乐趣:使用 PowerShell 创建 PowerShell 脚本

作者:精品下载站 日期:2024-12-14 07:43:37 浏览:12 分类:玩电脑

周五乐趣:使用 PowerShell 创建 PowerShell 脚本


[玩转系统] 周五乐趣:使用 PowerShell 创建 PowerShell 脚本

#requires -version 3.0

#run this in the PowerShell ISE for best results

Function Get-CommandMetadata {

<#
.Synopsis
Create a proxy function of a PowerShell command.
.Description
This command will create a proxy version of a PowerShell cmdlet, function or alias. The intent is to simplify creating a new function from command metadata. You can give your command and opt to remove help references for the original command. 

If you run this in the PowerShell ISE, code for the new function will be inserted into a new Powershell tab.
.Parameter Command
The name of a PowerShell command to proxy. This can be a cmdlet, function or alias.
.Parameter NewName
The name you want to use for your new command.
.Parameter NoHelp
Remove references to existing command help. Using this parameter will insert a comment-based help outline.
.Example
PS C:\> Get-CommandMetadata Get-WMIObject -nohelp -newname Get-MyOS

Create a proxy function for Get-WMIObject that will be called Get-MyOS. Help references will be replaced with a comment-help block.
.Notes
Last Updated: Sept. 3, 2014
Version     : 1.1

.Link
https://jdhitsolutions.com/blog/2014/09/friday-fun-creating-powershell-scripts-with-powershell

#>
[cmdletbinding()]
Param(
[Parameter(Position=0,Mandatory,HelpMessage="Enter the name of a PowerShell command")]
[ValidateNotNullorEmpty()]
[string]$Command,
[string]$NewName,
[switch]$NoHelp
)

Try {
    Write-Verbose "Getting command metadata for $command"
    $gcm = Get-Command -Name $command -ErrorAction Stop
    #allow an alias or command name
    if ($gcm.CommandType -eq 'Alias') {
       $cmdName = $gcm.ResolvedCommandName
    }
    else {
        $cmdName = $gcm.Name
    }
    Write-Verbose "Resolved to $cmdName"
    $cmd = New-Object System.Management.Automation.CommandMetaData ($gcm)
}
Catch {
    Write-Warning "Failed to create command metadata for $command"
    Write-Warning $_.Exception.Message
}

if ($cmd) {
    #create the metadata
        
    if ($NewName) {
        $Name = $NewName
    }
    else {
        $Name = $cmd.Name
    }

    if ($noHelp) {
        #remove help link
        $cmd.HelpUri = $Null

        Write-Verbose "Defining a new comment based help block"
        #define outline for comment based help
$myHelp = @"

.Synopsis
PUT SYNTAX HERE
.Description
PUT DESCRIPTION HERE
.Notes
Created:`t$(Get-Date -format d) 

.Example
PS C:\> $Name

.Link
$cmdname

"@
    Write-Verbose "Creating proxy command with help" 
    $metadata = [System.Management.Automation.ProxyCommand]::Create($cmd,$myHelp)

    } #nohelp
    else {
        Write-Verbose "Creating proxy command" 
        $metadata = [System.Management.Automation.ProxyCommand]::Create($cmd)
    }

   Write-Verbose "Cleaning up parameter names"
   [regex]$rx="[\s+]$\{\w+\}[,|)]"
   $metadata = $metadata.split("`n") | foreach {
     If ($rx.ismatch($_)) {
     #strip off { } around parameter names 
      $rx.Match($_).Value.Replace("{","").Replace("}","")
     # "`n"
    }
    else {
     #just write the line
     $_
     }
    } #foreach

#define the text for the new command
    $text = @"
#requires -version $($PSVersionTable.psversion)

Function $Name {

$metadata

} #end function $Name
"@
    if ($host.Name -match "PowerShell ISE") {
    #open in a new ISE tab
    $tab = $psise.CurrentPowerShellTab.Files.Add()

    Write-Verbose "Opening metadata in a new ISE tab"
    $tab.editor.InsertText($Text)

    #jump to the top
    $tab.Editor.SetCaretPosition(1,1)
    }
    else {
      $Text
    }
}
Write-Verbose "Ending $($MyInvocation.MyCommand)"

} #end function

Set-Alias -Name gcmd -Value Get-CommandMetaData

目的是您可以使用此函数快速创建基于代理命令的PowerShell函数。我的函数包含为您的命令提供新名称并删除帮助引用的参数。我这样做的理论基础是,您正在底层命令之上构建一个新命令,并且希望包含您自己的帮助。如果您在 PowerShell ISE 中运行此函数,它会将您的代码粘贴到新的 ISE 选项卡中。

所以我可以运行这个:

get-commandmetadata Get-DnsClient -nohelp -NewName Get-MyDNSClient

最后是这样的:

#requires -version 4.0

Function Get-MyDNSClient {

[CmdletBinding(DefaultParameterSetName='ByName', PositionalBinding=$false)]
 param(
     [Parameter(ParameterSetName='ByName', ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
     [ValidateNotNull()]
     [uint32[]]
  $InterfaceIndex, 
     [Parameter(ParameterSetName='ByName', Position=0)]
     [ValidateNotNull()]
     [string[]]
  $InterfaceAlias, 
     [Parameter(ParameterSetName='ByName')]
     [Alias('Suffix')]
     [ValidateNotNull()]
     [string[]]
  $ConnectionSpecificSuffix, 
     [Parameter(ParameterSetName='ByName')]
     [ValidateNotNull()]
     [bool[]]
  $RegisterThisConnectionsAddress, 
     [Parameter(ParameterSetName='ByName')]
     [ValidateNotNull()]
     [bool[]]
  $UseSuffixWhenRegistering, 
     [Parameter(ParameterSetName='ByName')]
     [Alias('Session')]
     [ValidateNotNullOrEmpty()]
     [Microsoft.Management.Infrastructure.CimSession[]]
  $CimSession, 
     [Parameter(ParameterSetName='ByName')]
     [int]
  $ThrottleLimit, 
     [Parameter(ParameterSetName='ByName')]
     [switch]
  $AsJob) 
 begin
 {
     try {
         $outBuffer = $null
         if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
         {
             $PSBoundParameters['OutBuffer'] = 1
         }
         $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Get-DnsClient', [System.Management.Automation.CommandTypes]::Function)
         $scriptCmd = {& $wrappedCmd @PSBoundParameters }
         $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
         $steppablePipeline.Begin($PSCmdlet)
     } catch {
         throw
     }
 }
 
 process
 {
     try {
         $steppablePipeline.Process($_)
     } catch {
         throw
     }
 }
 
 end
 {
     try {
         $steppablePipeline.End()
     } catch {
         throw
     }
 }
 <#
 
 .Syntax
 PUT SYNTAX HERE
 .Description
 PUT DESCRIPTION HERE
 .Notes
 Created:	9/3/2014 
 
 .Example
 PS C:\> Get-MyDNSClient
 
 .Link
 Get-DnsClient
 
 #>
 

} #end function Get-MyDNSClient

我现在需要做的就是修改它以满足我的需求并充实帮助。顺便说一句,#requires 语句使用运行该函数的系统上的任何版本。这对我来说已经是最简单的事情了,但在一秒钟之内我就创建了 90 行 PowerShell 代码,没有任何拼写错误!

一如既往,我希望你们中的一些人能够尝试一下,并让我知道你们的想法。周末愉快。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯