【问题标题】:You must provide a value expression on the right-hand side of the '/' operator您必须在“/”运算符的右侧提供一个值表达式
【发布时间】:2011-01-20 15:18:16
【问题描述】:

这行得通

Dependencies\iis7psprov_x86.msi /qn /l* $SnapinInstallLog

但这不是

$SnapinInstaller = "Dependencies\iis7psprov_x86.msi"
$SnapinInstaller /qn /l* $SnapinInstallLog

我收到以下错误: 您必须在“/”运算符的右侧提供一个值表达式。 + $SnapinInstaller /q

如何使用变量 $SnapinInstaller 安装管理单元?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    PowerShell 将$SnapinInstaller 识别为变量并将其计算为字符串。如果您希望 PowerShell “调用”由变量命名的命令,那么您可以使用调用运算符 &,如下所示:

    & $SnapinInstaller /qn /l* $SnapinInstallLog
    

    虽然您可以使用Invoke-Expression,但通常会避免使用它,尤其是对于用户提供的数据,因为可能会发生脚本注入攻击,例如:

    PS> $SnapinInstallLog = Read-Host "Enter log file name"
    Enter log file name: c:\temp\snapin.log; remove-item C:\xyzzy -r -force -whatif
    PS> Invoke-Expression "$SnapinInstaller /qn /l* $SnapinInstallLog"
    

    这里发生了错误,因为用户能够注入任意脚本。

    OTOH,如果您在单个字符串中表示一堆参数(并且没有用户提供输入),Invoke-Expression 可以在这种情况下派上用场,例如:

    $psargs = "\\$computer -d -i 0 notepad.exe"
    Invoke-Expression "psexec.exe $psargs"
    

    【讨论】:

      【解决方案2】:

      这是因为 powershell 将 $SnapinInstaller 视为字符串,而不是命令。

      我记得的第一个做你想做的事情的方法是写

      Invoke-Expression -Command ($SnapinInstaller + " /qn /l* " + $SnapinInstallLog)

      这适用于 *.exe,我没有尝试使用 *.msi。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-19
        • 2013-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多