История PowerShell: как предотвратить дублирование команд? - PullRequest
17 голосов
/ 17 сентября 2009

Справочная информация:

История PowerShell стала для меня намного полезнее, поскольку теперь у меня есть возможность сохранять историю между сеансами.

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

Теперь я пытаюсь запретить PowerShell сохранять дубликаты команд в моей истории.

Я пытался использовать Get-Unique, но это не работает, так как каждая команда в истории "уникальна", потому что у каждой из них свой идентификационный номер.

Ответы [ 3 ]

23 голосов
/ 17 сентября 2009

Get-Unique также требует отсортированный список, и я предполагаю, что вы, вероятно, хотите сохранить порядок исполнения. Попробуйте вместо этого

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

Этот подход использует командлет Group-Object для создания уникальных групп команд и затем блок 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
6 голосов
/ 11 мая 2018

Следующая команда работает для PowerShell в Windows 10 (протестировано в v.1803). Опция задокументирована здесь .

Set-PSReadLineOption –HistoryNoDuplicates:$True

На практике вызов PowerShell следующей командой (например, сохраненной в ярлыке) открывает PowerShell с историей без дубликатов

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NoExit -Command Set-PSReadLineOption –HistoryNoDuplicates:$True
0 голосов
/ 15 октября 2018

Не имеет прямого отношения к дубликатам, но также полезен, этот блок скриптов AddToHistoryHandler в моем $PROFILE хранит короткие и простые команды из моей истории:

$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
...