4

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

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

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

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

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

4

3 回答 3

2
  • doskey是一个主要设计用于与cmd.exePowerShell 一起使用的实用程序,而不是 PowerShell

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

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

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

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

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


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

  • It cannot be used with the PSReadLine module, which by default handles command-line editing since Windows 10 and provides invaluable functionality.

  • doskey macro expansion invariably also occurs when scripts solicit arbitrary user input via Read-Host, which is undesired.


Therefore, I suggest you abandon doskey in favor of PowerShell functions, and add them to your $PROFILE file so that they're available in every session:

  • While you can define functions named for numbers such as 105in PowerShell, you'll have to invoke them with & so as to disambiguate from actual numbers, e.g., & 105.

  • Therefore, I suggest refactoring your approach to define a single function named, say, c, that takes an optional argument to identify which file(s) to open:

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

Your original doskey macros then map onto this function as follows:

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

Note that this not only allows you to pass an arbitrary file name (of a file located in E:/static5/) to function c, but even multiple ones; e.g., c 105 135 would open both files for editing.

To inspect the definition of function c later, you can simply call $function:c or, more verbosely, (Get-Command c).Definition.


[1] As PetSerAl notes: "doskey performs translations on the console input buffer. [...]. It does not work if the console is not in line input mode, thus it is not compatible with PSReadline, although Read-Host will be affected.
https://i.stack.imgur.com/HpYzq.png"

于 2019-03-11T01:46:41.343 回答
1

我从来没有在 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'
}
于 2019-03-10T17:37:04.840 回答
1

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

如果您希望结果只是宏而不是整行,您可以添加 a| 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-03-10T19:21:03.360 回答