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"