【问题标题】:How to get full command from doskey alias in Windows PowerShell如何从 Windows PowerShell 中的 doskey 别名获取完整命令
【发布时间】:2019-03-10 17:19:58
【问题描述】:

我使用的是 Windows PowerShell,它是使用 doskey 宏配置的。 我有一个名为Macros.doskey 的文件。

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

如何获取别名对应的命令?

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

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

【问题讨论】:

  • 这个doskey /macros 将列出当前的doskey 宏集。您可以相当轻松地解析结果文本。 [咧嘴]
  • @Lee_Dailey 看起来很有希望。如果Get-Command 和/或Get-Alias 可以扩展到列出这些,那该有多酷?!
  • @briantist - 我不会那样做。我更喜欢保持内置的东西不变。但是,如果需要的话,为那些编写一个包装器是相当容易的。我会创建一个调用doskey 的函数,并使用过滤器匹配参数值。 [咧嘴]
  • @Lee_Dailey, doskey /macros 命令列出了完整的 doskey 宏集。如何只显示一个命令?
  • @SanjayRaz - 在自定义函数中使用 doskey /macros | Where-Object {$_ -match $Var} 之类的东西。使用 ISE 的基本功能模板使其变得非常简单。 [咧嘴]

标签: powershell windows-10 doskey


【解决方案1】:
  • doskey 是一个实用程序主要设计用于cmd.exe,而不是 PowerShell

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

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

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

      • 请注意,然后是 doskey 扩展了用户键入的宏名称,这意味着 PowerShell 只能看到 expanded 命令,因此不知道宏名称。因此,尝试使用
        Get-Command 检查 doskey 宏是行不通的;检查doskey /macros 的输出,如Lee Dailey's answer

      • 此外,doskey 在通过Read-Host[1] 请求任意用户输入时也会解析宏,这是不受欢迎的。


总结不在PowerShell中使用doskey的原因

  • 它不能与 PSReadLine 模块一起使用,该模块默认处理自 Windows 10 以来的命令行编辑并提供宝贵的功能。

  • doskey 宏扩展总是在脚本通过Read-Host 请求任意用户输入时发生,这是不受欢迎的。


因此,我建议您放弃 doskey 转而使用 PowerShell 函数,并将它们添加到您的 $PROFILE 文件中,以便它们在每个会话中都可用:

  • 虽然您可以在 PowerShell 中定义以数字命名的函数,例如 105,但您必须使用 & 调用它们以消除实际数字的歧义,例如, & 105

  • 因此,我建议重构您的方法以定义一个名为c单个函数,该函数采用可选的参数 em> 确定要打开的文件:

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"

【讨论】:

    【解决方案2】:

    我从来没有在 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'
    }
    

    【讨论】:

    • 感谢您的快速回复。当我使用函数来模拟 doskey 功能时,您的解决方案有效,但在我的情况下,PowerShell 给了我一些类似 Get-Command 的错误:“105”一词未被识别为 cmdlet、函数、脚本文件或可运行程序的名称.检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。在 line:1 char:1 + Get-Command 105 |格式列表 *
    • @SanjayRaz 这很有趣,我不知道该命令如何在 PowerShell 中工作,而无法通过Get-Command 发现。不幸的是,我现在不能真正花时间进行 doskey 设置和调查,但也许其他人能够承担。如果可能的话,我建议从 doskey 继续前进。
    • doskey 翻译控制台输入缓冲区。 PowerShell 永远不会看到原始行。如果控制台不是行输入模式,则它不起作用,因此它与PSReadline 不兼容,尽管Read-Host 会受到影响。 i.stack.imgur.com/HpYzq.png
    • @briantist:PetSerAl 的评论暗示你永远无法用Get-Command 检查doskey 宏,因为doskey 宏,如果它们实际上是实际上(它们不会加载PSReadLine,除非您使用Read-Host,这是您想要它们的地方),之前扩展PowerShell 曾经看到 已经展开 命令。
    【解决方案3】:

    这会很好地完成这项工作。 [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'
    

    【讨论】:

      猜你喜欢
      • 2019-01-07
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多