繁体   English   中英

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

[英]How to get full command from doskey alias in Windows PowerShell

我正在使用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是一个主要用于cmd.exe而不是PowerShell的实用程序。

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

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

    • 您必须使用/exename=powershell.exe PowerShell)或/exename=pwsh.exe Core)调用任何doskey.exe宏定义,以便可以从PowerShell使用它们。

      • 请注意,然后doskey扩展用户键入的宏名称,这意味着PowerShell只能看到扩展的命令,因此不知道宏名称。 因此,尝试检查doskey
        Get-Command不起作用; 检查doskey /macros的输出,如Lee Dailey的回答

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


总结在PowerShell中不使用doskey原因

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

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


因此,我建议您放弃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 ,但即使者; 例如, 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 *

从那里,你可能会看到像doskey.exe这样的doskey.exe或者你也会看到其他信息。

如果它只是作为可执行文件列出,那么我不确定你是否能够从doskey中获取信息。

PowerShell有自己的别名版本,可以让你进行完全发现,但PowerShell别名不能接受参数,它们只是将一个命令别名为另一个。

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

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

这将很好地完成这项工作。 [ grin ]请注意,它只是提供与宏匹配的文本。 我没有测试多线宏,也不知道是否可能。

如果你想让结果只是宏而不是整行,你可以添加一个| ForEach-Object {$_.Split('=')[1]} | 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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM