powershell - 如何转义 $* 中的所有引号以将其从 CMD 传递给 PowerShell
问题描述
PowerShell
我在执行命令时遇到了一些问题CMD
。
我MyFunction
在 PowerShell 中有一个函数,它接受两个参数:Id
和Text
. 例子:
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 $* }
解决方案
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 $*
推荐阅读
- java - 在空流上抛出异常的优雅方法
- python - 错误:需要 Microsoft Visual C++ 14.0。使用“Visual Studio 构建工具”获取它:https://visualstudio.microsoft.com/downloads/
- symfony - 创建没有实体的自定义入口点
- html - 将类添加到双花括号
- c# - 在 C# 库 Novell 的 ldap 搜索中使用全局编录
- javascript - jQuery $.post - TypeError:在未实现接口 HTMLInputElement 的对象上调用了“stepUp”
- microservices - @Value 和 @ConfigurationProperties 之间的区别?
- vue.js - Vuetify 将页脚列与数据表中的表列对齐
- amazon-web-services - 如何使用 CDK 将账户作为委托人添加到 Elasticsearch 访问策略?
- python - 在 QTextEdit (Qt) 中带有 CSS 格式的 HTML