您必须在'/'运算符的右侧提供值表达式

时间:2011-01-20 15:18:16

标签: powershell

这有效

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

但这不是

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

我收到以下错误: 您必须在'/'运算符的右侧提供值表达式。 + $ SnapinInstaller / q<<<< n / l * $ SnapinInstallLog

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

2 个答案:

答案 0 :(得分:9)

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" ,尤其是在用户提供的数据时,例如:

Invoke-Expression

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

OTOH如果你有一个用单个字符串表示的束参数(并且没有用户提供输入),$psargs = "\\$computer -d -i 0 notepad.exe" Invoke-Expression "psexec.exe $psargs" 在这种情况下可以派上用场,例如:

{{1}}

答案 1 :(得分:0)

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

做你想做的第一种方法我记得是写

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

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