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

How to get full command from doskey alias in Windows PowerShell

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

的文件
105=code E:\static55
135=code E:\static55
static5=code E:\static5

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

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

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

我从未在 PowerShell 中使用过 doskey,所以我不确定它们是如何显示的。我最好的猜测是 PowerShell 将它们视为 "Application" 类型的命令,这通常意味着外部可执行文件。

首先,检查 PowerShell 看到的内容:

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

从那里,您可能只会看到一些像 doskey.exe 这样的 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: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'
  • doskey 是一个实用程序 主要设计用于 cmd.exe,而不是 PowerShell.

    • PowerShell 以别名和函数的形式内置了更好的功能,在 Windows10 中,您甚至必须停用 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 的输出,如 .

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


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

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

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


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

  • 虽然您可以定义以数字命名的函数,例如在 PowerShell 中 105,但您必须使用 & 以消除与实际数字的歧义,例如 & 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,甚至 multiple 那些;例如,c 105 135 将打开 两个 个文件进行编辑。

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


[1] 正如 PetSerAl 指出的那样:“doskey 在控制台输入缓冲区上执行翻译。[...]。如果控制台不是在线路输入模式下,因此它不兼容PSReadline,但Read-Host会受到影响。
https://i.stack.imgur.com/HpYzq.png"