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

[玩转系统] 复制 PowerShell 历史命令

作者:精品下载站 日期:2024-12-14 08:05:31 浏览:15 分类:玩电脑

复制 PowerShell 历史命令


我想分享一个简短但有用的 PowerShell 实用程序。这是我写作时非常方便的东西。如您所知,PowerShell 在 PowerShell 会话中维护命令历史记录。您可以使用 Get-History cmdlet 或其别名 h 查看历史记录。要重新运行命令,请使用 Invoke-History 或其别名 r,并指定历史 ID。您还可以使用 PSReadline 和 Ctrl+R 来搜索历史记录。这种方法的一个优点是,从技术上讲,您可以搜索保存的历史记录,其中可以包括以前会话中的命令。我一直使用这个,但有时,我的需求略有不同。这就是今天的功能发挥作用的地方。

很多时候我想要历史记录项目中的命令行。运行这个看看我在说什么。

Get-History | Select ID,Commandline

我要么需要复制命令行,以便将其粘贴到文档中,要么我想将其带回提示符以重新运行或编辑然后运行。运行 Invoke-History 对于重新运行命令来说非常简单,但我无法调整它。或者我可以使用 PSReadline 并搜索命令。一旦找到它,我就可以调整它然后运行它。但我需要介于两者之间的东西。答案是一个将命令行从指定历史记录项复制到剪贴板的实用程序。 Lee Holmes 在 PowerShell Cookbook 中描述了类似的实用程序。这是我的版本。

Function Copy-HistoryCommand {

    [CmdletBinding(SupportsShouldProcess)]
    [alias("ch")]
    [outputtype("None", "System.String")]
    Param(
        [Parameter(Position = 0)]
        [ValidateNotNullOrEmpty()]
        [int]$ID = $(Get-History).Count,
        [switch]$Passthru)

    Begin {
        Write-Verbose "[BEGIN  ] Starting: $($MyInvocation.Mycommand)"
    } #begin

    Process {
        Write-Verbose "[PROCESS] Getting commandline from history item: $id"
        $cmdstring = (Get-History -Id $id).CommandLine
        If ($PSCmdlet.ShouldProcess("ID #$id [$cmdstring]")) {
            $cmdstring | Microsoft.PowerShell.Management\Set-Clipboard

            If ($Passthru) {
                #write the command to the pipeline
                $cmdstring
            } #If passthru
        }
    } #process

    End {
        Write-Verbose "[END    ] Ending: $($MyInvocation.Mycommand)"
    } #end

} #close function

该命令非常简单。它获取命令行属性并使用 Set-Clipboard 将其复制到剪贴板。该函数只是通过定义别名并添加一些功能(例如 -Passthru 和 -WhatIf)来简化此操作。

[玩转系统] 复制 PowerShell 历史命令

在此示例中,我将命令从历史记录项 #3 复制到剪贴板。我使用了 -Passthru 所以你可以自己看看。在 Windows 终端会话中,我可以使用 Ctrl+V 或鼠标右键在提示符处粘贴命令。这就是我喜欢这个的原因。只需按几个简单的按键即可返回我想要编辑并重新运行的命令。我还没有找到复制命令并将其自动粘贴到下一个提示中的方法。但目前的过程足够简单且快速。

该命令最终将成为 PSScriptTools 模块的一部分。但现在,如果您觉得有用,请随意使用此代码。

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

取消回复欢迎 发表评论:

关灯