您必须在“/”操作的右侧提供一个值表达式

问题描述:

这工作您必须在“/”操作的右侧提供一个值表达式

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

但这并不

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

我得到以下错误: 你必须提供在“/”操作者的右手侧的值表达式。 + $ SnapinInstaller/Q < < < < N/L * $ SnapinInstallLog

我要如何管理单元安装与变量$ SnapinInstaller?

PowerShell可识别$SnapinInstaller作为变量,并评估它 - 为一个字符串。如果你想PowerShell来“呼吁”由变量命名的命令,那么使用呼叫运营商&像这样:

& $SnapinInstaller /qn /l* $SnapinInstallLog 

虽然可以使用Invoke-Expression,它通常是可以避免的,尤其是利用用户提供的数据,由于脚本注入攻击possibilty例如:

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" 
+0

plussss wunnnnnn – x0n 2011-01-20 16:36:40

这是因为PowerShell将$ SnapinInstaller像一个字符串,而不是命令。

做你想做的,我可以remeber什么的第一种方式是写

调用-表达-Command($ SnapinInstaller + “/ QN/L *” + $ SnapinInstallLog)

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