【问题标题】:PowerShell history: how do you prevent duplicate commands?PowerShell 历史:如何防止重复命令?
【发布时间】:2009-09-17 13:07:06
【问题描述】:

背景:

PowerShell 历史记录对我来说非常有用,因为我可以跨会话保存历史记录。

# Run this every time right before you exit PowerShell
get-history -Count $MaximumHistoryCount | export-clixml $IniFileCmdHistory;

现在,我正试图阻止 PowerShell 将重复的命令保存到我的历史记录中。

我尝试使用Get-Unique,但这不起作用,因为历史记录中的每个命令都是“唯一的”,因为每个命令都有不同的 ID 号。

【问题讨论】:

  • Set-PSReadlineOption -HistoryNoDuplicates,但它似乎对我不起作用。

标签: command-line powershell history


【解决方案1】:

Get-Unique 还需要一个排序列表,我假设您可能想要 保持执行顺序。试试这个

Get-History -Count 32767 | Group CommandLine | Foreach {$_.Group[0]} |
Export-Clixml "$home\pshist.xml"

此方法使用 Group-Object cmdlet 创建唯一的命令存储桶 然后 Foreach-Object 块只抓取每个桶中的第一项。

顺便说一句,如果您希望将所有命令保存到历史文件中,我将使用限制值 - 32767 - 除非您将 $MaximumHistoryCount 设置为。

顺便说一句,如果您想在退出时自动保存它,您可以在 2.0 上执行此操作,例如 所以

Register-EngineEvent PowerShell.Exiting {
  Get-History -Count 32767 | Group CommandLine |
  Foreach {$_.Group[0]} | Export-CliXml "$home\pshist.xml" } -SupportEvent

然后在加载时恢复你所需要的就是

Import-CliXml "$home\pshist.xml" | Add-History

【讨论】:

  • hmm ...感谢您的帖子,但您是否遗漏了分配给 $hist 的部分?
  • 抱歉,为了避免可怕的水平滚动条,我只是选择了 $IniFileCmdHistory 以外的变量名。 :-)
  • Get-History | Select -Unique 怎么样?这至少在这里对我有用,并且避免了分组和 foreach(在理解你在那里做什么之前我不得不看两次:-))
  • 这就是我最初提出的答案,但结果对象不是完整的 HistoryInfo 对象,因此当您尝试使用“Import-Clixml | Add-历史”你得到一个错误。
  • 感谢基思的精彩提示。不过,我会做一个小调整:if (Test-path $MyHistoryFile) { Import-CliXml $MyHistoryFile | Add-History } 这样可以避免在编辑个人资料后第一次启动 PowerShell 时出现的错误消息。
【解决方案2】:

以下命令适用于 Windows 10 中的 PowerShell(在 v.1803 中测试)。该选项记录在here

Set-PSReadLineOption –HistoryNoDuplicates:$True

实际上,使用以下命令(例如保存在快捷方式中)调用 PowerShell 会打开 PowerShell,其中包含没有重复的历史记录

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoExit -Command Set-PSReadLineOption –HistoryNoDuplicates:$True

【讨论】:

  • 现在只需将Set-PSReadLineOption -HistoryNoDuplicates 放入我的$PROFILE 即可。不知道是不是早期版本的问题。
  • 使用 PowerShell 配置文件也可以。它需要 creating it 并更改默认的 execution policy 以防止运行脚本。
【解决方案3】:

与重复项没有直接关系,但同样有用,我的 $PROFILE 中的这个 AddToHistoryHandler 脚本块将简短的命令排除在我的历史记录之外:

$addToHistoryHandler = {
    Param([string]$line)
    if ($line.Length -le 3) {
        return $false
    }
    if (@("exit","dir","ls","pwd","cd ..").Contains($line.ToLowerInvariant())) {
        return $false
    }
    return $true
}
Set-PSReadlineOption -AddToHistoryHandler $addToHistoryHandler

【讨论】:

  • 很有帮助。谢谢。 ?
猜你喜欢
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2010-10-14
  • 2011-08-09
相关资源
最近更新 更多