Как получить полную команду из псевдонима doskey в Windows PowerShell - PullRequest
3 голосов
/ 10 марта 2019

Я использую Windows PowerShell, и он настроен с помощью макросов doskey. У меня есть файл с именем Macros.doskey.

105=code E:\static5\105
135=code E:\static5\135
static5=code E:\static5

Как получить команду, соответствующую псевдониму?

Например, когда я набираю 105 в PowerShell, он выполнит команду code E:\static5\105

Теперь я хочу узнать, как получить команду из псевдонима.

Ответы [ 3 ]

2 голосов
/ 11 марта 2019
  • doskey - это утилита , предназначенная главным образом для работы с cmd.exe, а не с PowerShell .

    • PowerShell имеет улучшенную встроенную функциональность в виде псевдонимов и функций, и в Windows 10 вы даже должны деактивировать собственное редактирование командной строки PowerShell, чтобы даже заставить работать doskey (см. Ниже).
  • Если вы все еще хотите использовать doskey в PowerShell, есть два предварительных условия :

    • Модуль PSReadLine - который обрабатывает редактирование командной строки начиная с Windows 10 по умолчанию - должен не быть загружен, как требуется приоритет над doskey определениями [1] ; то есть вам может понадобиться выгрузить его явно с помощью Remove-Module PSReadLine, но это означает, что вы потеряете все его преимущества .

    • Вы должны вызывать любые макроопределения doskey.exe с /exename=powershell.exe (Windows PowerShell) или /exename=pwsh.exe (PowerShell Core), чтобы их можно было использовать из PowerShell.

      • Обратите внимание, что именно тогда doskey раскрывает имя макроса, набранное пользователем, что означает, что PowerShell видит только команду extended и поэтому не знает имен макросов. Поэтому попытка проверить макросы doskey с помощью
        Get-Command не будет работать; вместо этого проверьте вывод из doskey /macros, как в ответе Ли Дейли .

      • Кроме того, doskey также разрешает макросы при запросе произвольного пользовательского ввода через Read-Host [1] , что нежелательно.


Подводя итог причин не использовать doskey в PowerShell :

  • Его нельзя использовать с модулем PSReadLine, который по умолчанию обрабатывает редактирование командной строки начиная с Windows 10 и предоставляет неоценимую функциональность.

  • doskey расширение макроса неизменно также происходит, когда сценарии запрашивают произвольный ввод данных пользователем через Read-Host, что нежелательно.


Поэтому я предлагаю вам отказаться от doskey в пользу PowerShell функций и добавить их в $PROFILE файл , чтобы они были доступны в каждом сеансе:

  • В то время как вы можете определять функции, названные для чисел, такие как 105 в PowerShell, вам придется вызывать их с помощью &, чтобы отсеивать фактические числа, например, & 105.

  • Поэтому я предлагаю изменить ваш подход к определить одну функцию с именем, скажем, c, которая принимает необязательный аргумент для определить, какие файлы открывать:

function c { pushd E:/static5; code $(if ($Args) { $Args } else { '.' }); popd }

Ваши оригинальные макросы doskey затем отображаются на эту функцию следующим образом:

  • 105 -> c 105
  • 135 -> c 135
  • static5 -> c

Обратите внимание, что это позволяет не только передавать произвольное имя файла (файла, находящегося в E:/static5/) в функцию c, но даже кратное ; например, c 105 135 откроет оба файла для редактирования.

Чтобы проверить определение функции c позже, вы можете просто вызвать $function:c или, более подробно, (Get-Command c).Definition.


[1] Как отмечает PetSerAl : «doskey выполняет трансляции в буфере ввода консоли. [...]. Не работает, если консоль не находится в режиме линейного ввода таким образом, он не совместим с PSReadline, хотя будет затронут Read-Host.
https://i.stack.imgur.com/HpYzq.png"

1 голос
/ 10 марта 2019

это сделает работу довольно хорошо.[ grin ] обратите внимание, что он просто дает текст, соответствующий макросу.я не тестировал с многострочными макросами, и при этом я не знаю, возможно ли это вообще.

Если вы хотите, чтобы результатом был просто макрос вместо полной строки, вы можете добавить | ForEach-Object {$_.Split('=')[1]}, чтобы получить деталь после =.

@"
404=echo '404'
666=echo '666'
dwd=echo 'Doo Wa Diddy'
"@ | Set-Content "$env:TEMP\Doskey-Macros.txt" -Force

doskey /macrofile=c:\temp\doskey-macros.txt

function DKA ($Macro)
    {
    doskey /macros |
        Where-Object {
            $_ -match $Macro
            }
    }

тестирование и вывод ...

dka -Macro dwd
dwd=echo 'Doo Wa Diddy'

dka -Macro adg
# nothing at all since there was no match

dka 404
404=echo '404'
1 голос
/ 10 марта 2019

Я никогда не использовал doskey с PowerShell, поэтому я не уверен, как они выглядят. Мое предположение заключается в том, что PowerShell рассматривает их как команды типа «Приложение», что обычно означает внешние исполняемые файлы.

Для начала проверьте, что видит PowerShell:

Get-Command 105 | Format-List *
# or
gcm 105 | fl *

Оттуда вы можете увидеть просто какой-нибудь exe-файл типа doskey.exe или, возможно, вы увидите дополнительную информацию.

Если он только что указан как исполняемый файл, то я не уверен, что вы сможете получить информацию из doskey.

PowerShell имеет собственные версии псевдонимов, которые позволили бы вам выполнить полное обнаружение, но псевдонимы PowerShell не могут принимать параметры, они просто называют одну команду другой.

Вы можете смоделировать функциональность doskey в PowerShell, написав вместо этого следующие функции:

function static5 {
    code.exe 'E:\static5'
}
...