如何从命令行将字符串参数传递给 Powershell 以进行 ConvertFrom-StringData?

Ger*_*der 7 powershell

我在使用应该使用可变数量参数的脚本运行 powershell 时遇到问题。

脚本文件如下所示:

param( [string]$paramString )

$params = ConvertFrom-StringData $paramString
$params
Run Code Online (Sandbox Code Playgroud)

直接在 powershell 中运行脚本会产生预期结果:

[PS] C:\some\path>.\test.ps1 "a=foo `n b=bar `n c=moo"

Name                           Value
----                           -----
c                              moo
a                              foo
b                              bar
Run Code Online (Sandbox Code Playgroud)

使用相同的脚本和参数从命令行调用 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
Run Code Online (Sandbox Code Playgroud)

似乎传递的字符串采用某种格式,因此该ConvertFrom-StringData函数无法再解析它。

Rom*_*min 7

方法-File是有问题的,因为参数不是由 cmd 计算的(在 PowerShell 中),并且新行等效项不会扩展,它们是按字面传递的。

如果我们仍然让 PowerShell 来执行此操作,则问题可以解决-Command

powershell -nologo -command "./test.ps1 ""a=foo `n b=bar `n c=moo"""
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢罗马,这有效。只是另一件事的附录:我的脚本有第二个参数,其中包含应该按字面意思使用的字符串。使用 ""param1"" ""a=foo `nb=bar `nc=moo"" 导致两个字符串被连接。我必须使用 'param1' ""a=foo `nb=bar `nc=moo"" 才能使其按预期工作。 (3认同)
  • 是的...从 cmd 调用具有复杂参数的 PowerShell 脚本是很痛苦的。如果在设计时就知道脚本是供cmd调用的,那么它的输入界面应该设计得尽可能简单。也请考虑这个建议,因为使用“-Command”的方法并没有涵盖“-File”方法的所有用例。 (2认同)