代码之家  ›  专栏  ›  技术社区  ›  stefan.seeland

在命令行上设置公共属性值

  •  3
  • stefan.seeland  · 技术社区  · 8 年前

    Setting Public Property Values on the Command Line msi的

    MyInstaller.msi PUBLICPROPERTY="someValue"
    

    这适用于“命令提示符”aka cmd.exe和powershell。

    但是

    MyInstaller.msi PUBLICPROPERTY=""
    

    无法在powershell中正常工作。我希望它将PUBLICPROPERTY设置为null,但它将PUBLICPROPERTY设置为值“CURRENTDIRECTORY=”C:\ temp\msi\“”(它的工作方式与cmd.exe的预期类似)。

    为什么powershell和cmd.exe的行为不同,如何修复?

    1 回复  |  直到 8 年前
        1
  •  3
  •   mklement0    7 年前

    PowerShell在必要的Windows上执行 重新引用 你在幕后的争论。

    这种无形的引用并不总是如预期的那样有效 ,例如在本例中。

    你可以通过 调整报价 :

    ... PUBLICPROPERTY=`"`"  # `-escape the " chars.
    
    ... 'PUBLICPROPERTY=""'  # use enclosing '...', so " chars. can be used as-is
    

    注意使用 '...' 如果要在参数中包含PowerShell变量/表达式的值,则无法工作。

    另外,在PSv3+中可以使用 --% , the stop-parsing symbol ,使PowerShell 将其余的参数按原样传递,就像您从 cmd.exe /批处理文件 (包括扩展环境变量引用,如 %OS% ).

    ... --% PUBLICPROPERTY=""
    

    同样,您将无法以这种方式引用参数中的PowerShell变量或表达式。


    至于发生了什么 没有 以上技巧:

    • PUBLICPROPERTY="someValue" 变成
      PUBLICPROPERTY=someValue

    • PUBLICPROPERTY="some Value" ,由于空白,变成
      "PUBLICPROPERTY=some Value" ,即 整个论点 包含在 "..." .

    PowerShell- 内部 争论如 PUBLICPROPERTY=“某个值” 有它的语录 脱光的 :如果将这样的参数传递给PowerShell cmdlet或函数,它将看到 PUBLICPROPERTY=someValue .

    将此值传递给 外部程序 ,PowerShell决定 情景 是否需要双引号,但该引号仅适用于 整个论点 -的初始位置 " 查尔斯。是迷路了。

    因此, PUBLICPROPERTY=“某个值” 变成 PUBLICPROPERTY=someValue 被传下去了 原样 ,因为它 不包含嵌入的空白 ,因此PowerShell不应用双引号。

    相比之下, PUBLICPROPERTY=“一些值” 变成 PUBLICPROPERTY=some Value ,传递为 “PUBLICPROPERTY=一些值” ,因为存在空白需要双引号才能将值保留为单个参数。

    请注意 PowerShell只适用于 双重的 -引用传递给外部程序的参数 ,因为这是所有程序都可以理解的唯一引用样式。

    重新引用的逻辑随着时间的推移而改变 bugs, which, regrettably, are here to stay 由于向后兼容性问题。

    例如, '3 " of rain' 变成 "3 " of rain" ,这是 破碎的 ,因为 嵌入的 " 缺乏逃避 ;解决方法是预先考虑到这一点,然后显式地执行PowerShell应该执行的操作 自动 :退出嵌入的 " 作为 \" 为了外部计划的利益: '3 \" of rain'