如何转义 $* 中的所有引号以将其从 CMD 传递给 PowerShell
How to escape all quotes in $* to pass it to PowerShell from CMD
我在从 CMD
执行 PowerShell
命令时遇到一些问题。
我在 PowerShell 中有一个函数 MyFunction
,它有两个参数:Id
和 Text
。
示例:
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 $*
我在从 CMD
执行 PowerShell
命令时遇到一些问题。
我在 PowerShell 中有一个函数 MyFunction
,它有两个参数:Id
和 Text
。
示例:
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 $*