2011-01-20 48 views
4

這工作您必須在「/」操作的右側提供一個值表達式

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

但這並不

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

我得到以下錯誤: 你必須提供在「/」操作者的右手側的值表達式。 + $ SnapinInstaller/Q < < < < N/L * $ SnapinInstallLog

我要如何管理單元安裝與變量$ SnapinInstaller?

回答

9

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

0

這是因爲PowerShell將$ SnapinInstaller像一個字符串,而不是命令。

做你想做的,我可以remeber什麼的第一種方式是寫

調用-表達-Command($ SnapinInstaller + 「/ QN/L *」 + $ SnapinInstallLog)

這適用於* .exe,我沒有用* .msi進行嘗試。

相關問題