Вы должны предоставить выражение значения в правой части оператора '/' - PullRequest
4 голосов
/ 20 января 2011

Это работает

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

Но это не

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

Я получаю следующую ошибку: Вы должны предоставить выражение значения в правой части '/оператор.+ $ SnapinInstaller / q <<<< n / l * $ SnapinInstallLog </p>

Как получить оснастку для установки с переменной $ SnapinInstaller?

Ответы [ 2 ]

9 голосов
/ 20 января 2011

PowerShell распознает $SnapinInstaller как переменную и оценивает ее - как строку. Если вы хотите, чтобы PowerShell «вызывал» команду, названную переменной, вы используете оператор вызова &, например, так:

& $SnapinInstaller /qn /l* $SnapinInstallLog

Хотя вы можете использовать Invoke-Expression, его обычно избегают, особенно с данными, предоставленными пользователем, из-за возможности атак с использованием сценариев, например ::10000

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 голосов
/ 20 января 2011

Это потому, что powershell рассматривает $ SnapinInstaller как строку, а не команду.

Первый способ сделать то, что вы хотите, я могу вспомнить, это написать

Команда-выражения-вызова ($ SnapinInstaller + "/ qn / l *" + $ SnapinInstallLog)

Это работает с * .exe, я не пробовал с * .msi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...