Изглежда, че за да се преминат пътища с вградени интервали към 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
.