如何从Windows PowerShell中的Doskey别名获取完整命令



我正在使用Windows PowerShell,并且使用Doskey宏配置。我有一个名为 Macros.doskey的文件。

105=code E:static5105
135=code E:static5135
static5=code E:static5

如何获得与别名名称相对应的命令?

例如,当我在PowerShell中键入105时,它将执行命令code E:static5105

现在我想知道如何从别名名称中获取命令。

  • doskey 是实用程序主要设计用于使用cmd.exe而不是PowerShell

    • PowerShell具有更好的功能,以别名和功能的形式内置,在Windows 10中,您甚至必须停用PowerShell自己的命令行编辑,甚至可以使doskey工作(请参见下文)。
  • 如果您仍然想在PowerShell中使用doskey,则有两个先决条件

    • PSReadLine模块 - 它处理命令行编辑以来Windows 10以来默认情况下 - 必须加载 not ,因为它比doskey定义优先 [1] ;也就是说,您可能需要用Remove-Module PSReadLine明确卸载它,但这意味着您将失去其所有好处。

    • 您必须使用/exename=powershell.exe(Windows PowerShell)或/exename=pwsh.exe(PowerShell Core)调用任何doskey.exe宏定义,才能从PowerShell中使用。

      • 请注意,即doskey扩展了用户键入的宏名称,这意味着PowerShell只能看到展开命令,因此不了解宏名称。因此,尝试使用
        Get-Command检查doskey宏无法使用;改用doskey /macros的输出,如Lee Dailey的答案中。

      • 此外,doskey还可以通过Read-Host [1] 在任意用户输入时解决宏,这是不希望的。


总结不使用powershell中doskey的原因

  • 它不能与PSReadLine模块一起使用,默认情况下,该模块从Windows 10开始处理命令行编辑并提供了宝贵的功能。

  • doskey宏扩展始终同样出现 当脚本通过Read-Host征求任意用户输入时,这是不希望的。


因此,我建议您放弃doskey支持PowerShell functions ,然后将它们添加到您的$PROFILE文件中,以便它们在每个会话中可用:

  • 当您 can 定义以诸如powershell中的 105之类的数字命名的函数时,您必须使用&调用它们,以使其与实际数字相差,例如& 105。p>

  • 因此,我建议您对的方法进行重构,以定义A 函数,例如c ,它采用可选的参数确定要打开的文件:

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

您的原始doskey宏,然后将其映射到此功能,如下:

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

请注意,这不仅允许您传递任意文件名(E:/static5/中的文件的文件)来函数 c,而且甚至多个 not;例如,c 105 135将打开两个用于编辑的文件。

稍后检查函数c的定义,您可以简单地调用$function:c或更言行的(Get-Command c).Definition


[1]正如PetSeral注释:" doskey在控制台输入缓冲区上执行翻译。[...]。如果控制台不在线输入模式,它与PSReadline不兼容,则它不起作用,尽管Read-Host将受到影响。
https://i.stack.imgur.com/hpyzq.png"

我从来没有与powershell一起使用doskey,所以我不确定它们是如何出现的。我最好的猜测是,PowerShell将它们视为类型"应用程序"的命令,通常意味着外部可执行文件。

要开始,检查PowerShell看到了什么:

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

从那里,您可能会看到一些EXE,例如doskey.exe,或者也许您也会看到其他信息。

如果仅列为可执行文件,那么我不确定您是否可以从Doskey中获取信息。

powershell具有自己的别名版本,可以让您进行完全发现,但是PowerShell别名不能采用参数,它们只是一个命令与另一个命令相称。

您可以通过编写功能来模拟PowerShell中的Doskey功能:

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

这将做得很好。[ grin ]请注意,它只是给出了与宏匹配的文本。我没有使用多行宏测试,也不知道这是否可能。

如果您希望结果仅是宏而不是完整行,则可以添加| ForEach-Object {$_.Split('=')[1]}以在=之后获取零件。

@"
404=echo '404'
666=echo '666'
dwd=echo 'Doo Wa Diddy'
"@ | Set-Content "$env:TEMPDoskey-Macros.txt" -Force
doskey /macrofile=c:tempdoskey-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'

最新更新