Изглежда, че за да се преминат пътища с вградени интервали към msiexec , трябва да използвате изрично вграден "..." цитиране около тях.
Във вашия случай това означава, че вместо да предаватеINSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' , трябва да подадете INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"'
Обърнете внимание на вградения "..." и допълнителния \ в края на пътя, за да сте сигурни, че \" сам по себе си не се бърка с избягал " от msiexec (въпреки че може да работи без допълнителния \ също).
За да съберем всичко заедно:
msiexec.exe /q /i `
'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' `
INSTALLLOCATION='"C:\Program Files\MongoDB\Server\3.4\\"' ADDLOCAL='all'
Внимание :
-
Тази техника на вградено цитиране се основава на дългогодишна, но счупена Поведение на PowerShell - вижте този отговор ; ако някога се поправи, техниката ще спре да работи; за разлика от това,
--%показаният по-долу подход ще продължи да работи. -
Метод без заобиколно решение и надежден за бъдещето е използването на PSv3+
ieпомощна функцията отNativeмодул (в PSv5+ инсталирайте сInstall-Module Nativeот галерия на PowerShell ), който вътрешно компенсира цялото повредено поведение и позволява предаване на аргументи според очакванията; просто добавяне наieкъм първоначалната ви команда би било достатъчно:
# No workarounds needed with the 'ie' function from the 'Native' module.
ie msiexec.exe /q /i 'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' INSTALLLOCATION='C:\Program Files\MongoDB\Server\3.4\' ADDLOCAL='all'
Алтернативатата е да се придържате към оригиналното цитиране и да използвате --% , символът за спиране на синтактичния анализ , но имайте предвид, че това означава, че не можете да използвате променливи на PowerShell във всички следващи аргументи:
msiexec.exe /q /i `
'C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi' `
--% INSTALLLOCATION="C:\Program Files\MongoDB\Server\3.4\\" ADDLOCAL='all'
Имайте предвид, че msiexec , въпреки че има CLI (интерфейс на командния ред), е GUI -подсистемно приложение, така че работи асинхронно по подразбиране; ако искате да го стартирате синхронно , използвайтеStart-Process -Wait :
$msiArgs = '/q /i "C:\Users\ADMINI~1\AppData\Local\Temp\mongo-server-3.4-latest.msi" INSTALLLOCATION="C:\Program Files\MongoDB\Server\3.4\\" ADDLOCAL=all'
$ps = Start-Process -PassThru -Wait msiexec -ArgumentList $msiArgs
# $ps.ExitCode contains msiexec's exit code.
Обърнете внимание, че низът от списъка с аргументи, $msiArgs , се използва както е от Start-Process като част от командния ред, използван за извикване на целевата програма (msiexec ), което означава:
-
само (вградено) двойно кавиране трябва да се използва.
- използвайте
"..."с вграден"екраниран като`"за вграждане на променливи и изрази на PowerShell в низа.
- използвайте
-
обратно, обаче, не е необходимо заобиколно решение за частично цитирани аргументи.
Въпреки че Start-Process технически поддържа предаването на аргументите индивидуално , като масив , това е най-добре да се избягва поради дългогодишен бъг – вижте GitHub проблем #5576
.