我正在使用Windows PowerShell,并且使用Doskey宏配置。我有一个名为 Macros.doskey
的文件。
105=code E:static5105
135=code E:static5135
static5=code E:static5
如何获得与别名名称相对应的命令?
例如,当我在PowerShell中键入105
时,它将执行命令code E:static5105
现在我想知道如何从别名名称中获取命令。
-
doskey
是实用程序主要设计用于使用cmd.exe
而不是PowerShell 。- PowerShell具有更好的功能,以别名和功能的形式内置,在Windows 10中,您甚至必须停用PowerShell自己的命令行编辑,甚至可以使
doskey
工作(请参见下文)。
- PowerShell具有更好的功能,以别名和功能的形式内置,在Windows 10中,您甚至必须停用PowerShell自己的命令行编辑,甚至可以使
-
如果您仍然想在PowerShell中使用
doskey
,则有两个先决条件:-
PSReadLine
模块 - 它处理命令行编辑以来Windows 10以来默认情况下 - 必须加载 not ,因为它比doskey
定义优先 [1] ;也就是说,您可能需要用Remove-Module PSReadLine
明确卸载它,但这意味着您将失去其所有好处。 -
您必须使用
/exename=powershell.exe
(Windows PowerShell)或/exename=pwsh.exe
(PowerShell Core)调用任何doskey.exe
宏定义,才能从PowerShell中使用。-
请注意,即
doskey
扩展了用户键入的宏名称,这意味着PowerShell只能看到展开命令,因此不了解宏名称。因此,尝试使用
Get-Command
检查doskey
宏无法使用;改用doskey /macros
的输出,如Lee Dailey的答案中。 -
此外,
doskey
还可以通过Read-Host
[1] 在任意用户输入时解决宏,这是不希望的。
-
-
总结不使用powershell中doskey
的原因:
-
它不能与
PSReadLine
模块一起使用,默认情况下,该模块从Windows 10开始处理命令行编辑并提供了宝贵的功能。 -
doskey
宏扩展始终同样出现 当脚本通过Read-Host
征求任意用户输入时,这是不希望的。
因此,我建议您放弃doskey
支持PowerShell functions ,然后将它们添加到您的$PROFILE
文件中,以便它们在每个会话中可用:
-
当您 can 定义以诸如powershell中的
105
之类的数字命名的函数时,您必须使用&
调用它们,以使其与实际数字相差,例如& 105
。p> -
因此,我建议您对的方法进行重构,以定义A 单函数,例如
c
,它采用可选的参数确定要打开的文件:
function c { pushd E:/static5; code $(if ($Args) { $Args } else { '.' }); popd }
您的原始doskey
宏,然后将其映射到此功能,如下:
-
105
->c 105
-
135
->c 135
-
static5
->c
请注意,这不仅允许您传递任意文件名(E:/static5/
中的文件的文件)来函数 c
,而且甚至多个 not;例如,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 *
从那里,您可能会看到一些EXE,例如doskey.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:TEMPDoskey-Macros.txt" -Force
doskey /macrofile=c:tempdoskey-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'