如何在Windows Powershell中设置命令及其参数的别名?

utugiqy6  于 2023-03-18  发布在  Shell
关注(0)|答案(1)|浏览(188)

我使用的是Windows 11计算机(Powershell v5.1),我尝试将rust重写的coreutils别名为Powershell中的适当命令。例如,我需要调用coreutils echo来访问echo命令,对于mvcatcp等也是如此。因此,我编写了一个函数来输出命令字符串,并将其传递给Set-Alias cmdlet。
但是,我得到以下错误。

echo : The term 'coreutils echo' is not recognized as the name of a cmdlet, function, script file, or operable
program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ echo
+ ~~~~
    + CategoryInfo          : ObjectNotFound: (coreutils echo:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

这是我的powershell配置。

# neovim config alias
function Open-NeovimConfig {
  $CurrPath = pwd
  cd C:\Users\adity\AppData\Local\nvim\lua\user\
  nvim .\init.lua
  cd $CurrPath
  }

# coreutils command specifier
function Coreutils-Cmd($Cmd) {
    return "coreutils $Cmd"
}

Set-Alias nvimc Open-NeovimConfig
Set-Alias ls lsd -Option AllScope
Set-Alias echo (Coreutils-Cmd "echo") -Option AllScope
Set-Alias cat (Coreutils-Cmd "cat") -Option AllScope
Set-Alias cp (Coreutils-Cmd "cp") -Option AllScope

编辑:基于圣地亚哥的评论,我做了以下工作。然而,有很多重复的逻辑。有什么改进的建议吗?

function echo {coreutils echo $args}
function cat {coreutils cat $args}
function rm {coreutils rm $args}
function cp {coreutils cp $args}
function mv {coreutils mv $args}
wn9m85ua

wn9m85ua1#

您可以使用循环和Set-Item自动化该过程,以动态定义这些函数:

foreach($cmd in 'echo', 'cat', 'rm', 'cp', 'mv') {
    Remove-Alias $cmd -ErrorAction SilentlyContinue
    Set-Item function:$cmd -Value { coreutils $cmd $args }.GetNewClosure()
}

这样做的唯一原因是函数名恰好与传递给coreutils的参数相同,而且这里需要使用.GetNewClosure(),否则脚本块将使用$cmd的最后一个值。

相关问题