如何创建具有动态数量参数的 PowerShell 函数,每个参数都将传递给另一个命令?

如何创建具有动态数量参数的 PowerShell 函数,每个参数都将传递给另一个命令?

标题几乎是不言而喻的。以下是我迄今为止尝试过的方法:

function Git {
    $cmd = $args[0]
    for ($i = 1; $i -lt $args.count; $i++) {
        $cmd = $cmd + " " + $args[$i]
    }
    echo $(wsl git $cmd)
}

然而,调用例如git clone <clone URL>给我git: 'clone <clone URL>' is not a git command. See 'git --help'.所以看起来好像PowerShell正在将带引号的字符串传递给git命令,并且这导致它失败......或者我的代码中是否存在我遗漏的其他问题?

希望这些信息足以让任何 PowerShell 专家为我指明正确的方向...但是为了了解我实际的核心问题以及我为尝试解决该问题所做的事情,请继续阅读...

核心问题/现有解决方案

我试图将gitPowerShell 或 CMD 窗口中输入的所有命令重定向到 WSL,因为这是我git安装的唯一地方我希望保持这种状态。当我已经在 WSL 中安装了我需要的一切时,我认为安装 Git for Windows 或任何其他大型第三方工具是没有意义的。

唯一的缺点是:

  1. wsl git...每次我想要克隆、拉取、推送等操作时都要输入一些文字,这很麻烦也很累非常快对于每天多次输入此类命令的人来说。
  2. 它还破坏了我 Windows VS Code 安装中的 Git 扩展,导致没有安装适用于 Windows 的 Git。

我尝试了两种现有的解决方案,即https://github.com/hangxingliu/wslgithttps://github.com/andy-5/wslgit,但它们都给了我相同的错误信息:

PS C:\Users\Kenny> git --version
/usr/bin/wslgit.sh: line 83: cd: C:\Users\Kenny: No such file or directory
fatal: can not cd to C:\Users\Kenny (C:\Users\Kenny)

也可以看看这个看似相关的 GitHub 问题在前一个 repo 中获取更多信息。

我正在运行 Windows 10.0.19042.0,即 Windows 10 Home 的最新稳定版本。此版本或上一个版本中一定有一些重大变化,因为前一个 repo 的所有者在链接问题页面的评论中提到了这一点:

我对 wslgit.dev.sh 进行了一些更新。首先mount -t drvfs=> 没有返回任何内容,这是在更新到 2004 后发生的。所以我更新了 wslgit.dev.sh 文件...现在它对我有用了。之后,生成新的wslgit.sh并更改旧的。

我尝试了他们的建议,但似乎对我或问题的原作者都没有帮助。因此,我费尽心思编写了一个自定义 PowerShell 函数来实现类似的结果。

我已经浪费了一整天的时间来解决这个看似简单的问题(整个上午都在尝试让现有的解决方案发挥作用,而当天的剩余时间都在使用 PowerShell 解决方法)。因此,我非常希望:

  1. 对现有解决方案给出的错误消息的解释和修复,或者
  2. 一个可以执行我想要的操作的 PowerShell 函数,无需在已经太长的命令(IMO)中添加详细的参数名称或其他任何内容。

答案1

直接传递args数组似乎对我来说有效,如下所示:

function Git {
    echo $(wsl git $args)
}

至少对于您提到的简单克隆情况(和简单的Git status)而言。

虽然听起来这主要是您所需要的,但未来的读者应该意识到,这对于更复杂的用例可能会失败,例如任何需要用户输入的 git 命令、使用本地 Windows 路径作为目标或\\WSL$\在执行时处于 UNC 路径(包括)。

相关内容