首页 > 解决方案 > 如何转义 $* 中的所有引号以将其从 CMD 传递给 PowerShell

问题描述

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

MyFunction在 PowerShell 中有一个函数,它接受两个参数:IdText. 例子:

MyFunction 12345 "Name = Karl"

我需要从以下位置调用此函数CMD

powershell -Command . { MyFunction $* }

其中$*12345 "Name = Karl"

但我得到错误:

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

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

在此处输入图像描述

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

更新(2019 年 12 月 25 日)

我忘了提到我正在通过创建别名doskey,但我不知道如何在其中转义引号$*

MyFunction=powershell -Command . { MyFunction $* }

标签: powershellcmddoskey

解决方案


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

参数的预处理是必需的,因为您正在使用PowerShell CLI-Command参数- 因为您正在调用一个函数,所以在 PowerShell 剥离它们的封闭之后,参数会经历一轮额外"..."的解析:结果值为连接然后解释为一段 PowerShell 代码 - 到那时,最初"Name = Karl"被视为3 个单独的参数,Name,=Karl. 要解决这个问题,您必须使用嵌入式引用,而是通过传递"Name=Karl"as "\"Name = Karl\""(sic) 来代替。

但是,如果您使用-File而不是 ,-Command则不会有这个问题,但这仅在您调用脚本文件( *.ps1) 时有效。

这是一个解决方法

  • *.ps1创建一个名为的辅助文件MyFunction.ps1,其内容如下:
MyFunction $args

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

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

推荐阅读