我使用的是 Windows PowerShell,它是使用 doskey 宏配置的。我有一个名为Macros.doskey
.
105=code E:\static5\105
135=code E:\static5\135
static5=code E:\static5
如何获取别名对应的命令?
例如,当我输入105
PowerShell 时,它将执行命令code E:\static5\105
现在我想知道如何从别名中获取命令。
我使用的是 Windows PowerShell,它是使用 doskey 宏配置的。我有一个名为Macros.doskey
.
105=code E:\static5\105
135=code E:\static5\135
static5=code E:\static5
如何获取别名对应的命令?
例如,当我输入105
PowerShell 时,它将执行命令code E:\static5\105
现在我想知道如何从别名中获取命令。
doskey
是一个主要设计用于与cmd.exe
PowerShell 一起使用的实用程序,而不是 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 105
in 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"
我从来没有在 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 ] 请注意,它只给出与宏匹配的文本。我没有使用多行宏进行测试,也不知道这是否可能。
如果您希望结果只是宏而不是整行,您可以添加 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'