如何转义 $* 中的所有引号以将其从 CMD 传递给 PowerShell

How to escape all quotes in $* to pass it to PowerShell from CMD

我在从 CMD 执行 PowerShell 命令时遇到一些问题。

我在 PowerShell 中有一个函数 MyFunction,它有两个参数:IdText。 示例:

MyFunction 12345 "Name = Karl"

我需要从 CMD:

调用这个函数
powershell -Command . { MyFunction $* }

其中 $*12345 "Name = Karl"

但是我得到错误:

A positional parameter cannot be found that accepts argument 'Karl'

原因是引号从传递参数中删除

我发现我需要在传递参数时转义所有引号,但我真的不知道如何在 $* 内完成。我不是 CMD 方面的专家,你能帮我解决这个问题吗?

更新 (12/25/2019)

我忘了说我正在通过 doskey 创建别名,我不知道如何在 $*

中转义引号
MyFunction=powershell -Command . { MyFunction $* }

doskey 支持对传递的参数进行预处理 ($*),这是您的情况所需要的。

需要对参数进行预处理,因为您正在使用 PowerShell CLI-Command 参数 - 有必要,因为您正在调用 函数 - 其中 参数在 PowerShell 剥离后进行 附加 轮解析它们包含 "...":将结果值连接起来,然后解释为一段 PowerShell 代码 - 到那时,最初的 "Name = Karl" 被视为 3 个单独参数,Name=Karl。 要解决这个问题,你必须使用 embedded 引用 ,将 "Name=Karl" 作为 "\"Name = Karl\""(原文如此)相反。

但是,如果您使用 -File 而不是 -Command,您就不会遇到这个问题,但这仅在您调用 脚本文件 (*.ps1).

这是一个解决方法

  • 创建一个辅助 *.ps1 文件 命名为 MyFunction.ps1,包含以下内容:
MyFunction $args

请确保 function MyFunction 实际上已在您的 PowerShell 会话中定义。由于是 函数 ,它优先于具有相同基本名称的脚本。

  • 然后重新定义你的 doskey 宏如下(根据需要调整路径;如果你把 MyFunction.ps1 放在 $env:PATH 中列出的目录中,你不需要指定一个路径):
doskey MyFunction=powershell -File C:\path\to\MyFunction.ps1 $*