【发布时间】:2020-02-20 16:24:02
【问题描述】:
短版: 我需要一种在我自己的函数中模拟 Powershell 命令行解析的方法。类似于 .Net System.CommandLine 方法,但支持 Splatting。
详情: 我有一个包含一组 Powershell 命令的文本文件。文件内容可能如下所示:
Some-Command -parA "Some Parameter" -parB @{"ParamS"="value"; "ParamT"="value2"}
Some-Command -parA "2nd Parameter" -parB @{"ParamS"="SSS"; "ParamT"="value2"}
当我读取文件的每一行时,我需要转换该行并调用不同的命令并修改参数。从上面的第一行我需要执行 Other-Command 好像它被称为
Other-Command -parA "Some Parameter" -parB @{"ParamS"="value"; "ParamT"="Other Value"}
(顺便说一句,这些文件是由我从不同的程序生成的,所以我不需要担心我的输入会被清理。)
如果有人刚刚在 Powershell 中输入了上面的 Some-Command 行,那么参数将被解析出来,我可以通过名称访问它们,并且 splatted 参数将被转换为字典的哈希表。但是,既然这是 来自文本文件,这些都不会自动发生,所以我希望有一些命令行开关可以做到这一点,所以我不必自己动手。
在我目前的情况下,我知道所有参数名称是什么以及它们在字符串中的顺序,所以我可以硬编码一些字符串拆分来获取参数、值对。不过,这仍然存在分解 splatted 参数的问题。
我查看了ConvertFrom-StringData,它很相似,但并不完全符合我的需要:
ConvertFrom-StringData -StringData '@{"ParamS"="value"; "ParamT"="value2"}'
Name Value
---- -----
@{"ParamS" "value"; "ParamT"="value2"}
再一次,我在这个问题中所追求的只是分解这个字符串,就好像它是由 powershell 命令行解析器解析的一样。
编辑:显然我没有尽可能清楚。让我们试试这个。如果我将 parameterMangle 称为
parameterMangle -parmA "Some Parameter" -parmB @{"ParamS"="value"; "ParamT"="value2"}
然后有一个明确的语法来修改参数并将它们传递给另一个函数。
function parameterMangle ($parmA, $parmB)
{
$parmA = $($parmA) + 'ExtraStuff'
$parmB["ParamT"] = 'Other Value'
Other-Command $parmA $parmB
}
但是如果同一个调用是文件中的一行文本,那么使用字符串函数修改这些参数很容易出错。要稳健地做到这一点,您必须启动一个完整的词法分析器。我宁愿找到一些内置函数,它可以以与 powershell 命令行处理器完全相同的方式分解字符串。对于所有的双引号和大括号,该 splatted 参数特别困难。
【问题讨论】:
-
Invoke-Expression '@{"ParamS"="value"; "ParamT"="value2"}'?虽然Invoke-Expressionis considered harmful
标签: powershell