[英]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的实用程序。
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.