【问题标题】:How do I pass a string parameter to Powershell for ConvertFrom-StringData from command line?如何从命令行将字符串参数传递给 Powershell 用于 ConvertFrom-StringData?
【发布时间】:2023-03-22 02:02:01
【问题描述】:

我在运行 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 函数无法再解析它。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    -File 的方法是有问题的,因为该参数不是由 cmd 评估的(在 PowerShell 中),并且新行等价物没有展开,它们是按字面意思传递的。

    如果我们仍然让 PowerShell 使用 -Command 来解决问题,则问题可以解决:

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

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

    【讨论】:

    • 谢谢罗曼,成功了。只是另一件事的附录:我有一个脚本的第二个参数,其中包含一个应该按字面意思使用的字符串。使用 ""param1"" ""a=foo n b=bar n c=moo"" 导致两个字符串连接在一起。我不得不使用 'param1' ""a=foo n b=bar n c=moo"" 让它按预期工作。
    • 是的...从 cmd 调用带有复杂参数的 PowerShell 脚本很痛苦。如果在设计时知道脚本是用于从 cmd 调用的,那么它的输入界面应该设计得尽可能简单。也请考虑这个建议,因为-Command 的方法并未涵盖-File 方法的所有用例。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 2013-06-15
      • 2010-11-20
      • 2016-10-28
      相关资源
      最近更新 更多