如何在命令行中向Powershell的ConvertFrom-StringData传递字符串参数?

7

我遇到了使用一个可变数量参数的powershell脚本运行问题。

脚本文件如下:

param( [string]$paramString )

$params = ConvertFrom-StringData $paramString
$params

在PowerShell中直接运行脚本会产生预期的结果:
[PS] C:\some\path>.\test.ps1 "a=foo `n b=bar `n c=moo"

Name                           Value
----                           -----
c                              moo
a                              foo
b                              bar

在命令行中使用相同的脚本和参数调用powershell,结果如下:

C:\some\path>powershell -nologo -file ./test.ps1 "a=foo `n b=bar `n c=moo"

Name                           Value
----                           -----
a                              foo `n b=bar `n c=moo

看起来传递的字符串是某种格式,因此ConvertFrom-StringData函数无法再解析它。
2个回答

7

-File 参数的使用存在问题,因为该参数在 cmd 中并未被计算(就像在 PowerShell 中一样),且换行符等价项不会被展开,而是按字面意义传递。

如果我们仍然让 PowerShell 来处理,可以通过使用 -Command 解决该问题:

powershell -nologo -command "./test.ps1 ""a=foo `n b=bar `n c=moo"""

这样做很丑陋:我们必须在命令中的每个内部"字符前加上一个额外的"字符。但是它有效。(该命令可以由多个参数定义;我只喜欢使用单个参数:这种方式看起来对我来说更简单)。


3
谢谢Roman,这起作用了。关于另一件事的补充说明:我有一个脚本的第二个参数,其中包含应该按字面意义使用的字符串。使用""param1"" ""a=foo n b=bar n c=moo""会导致两个字符串被连接起来。我必须使用'param1' ""a=foo n b=bar n c=moo""才能使其按预期工作。 - Gerald Schneider
2
是的...通过 cmd 调用带有复杂参数的 PowerShell 脚本非常痛苦。如果在设计时知道脚本是为从 cmd 进行调用而设计的,则其输入界面应尽可能简单。也请考虑此建议,因为 -Command 方法不能涵盖 -File 方法的所有用例。 - Roman Kuzmin

-1

使用单引号将参数传递给 PowerShell 脚本,例如:

C:\some\path>powershell .\test.ps1 'a=foo' 'b=bar' 'c=moo'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接