Аргументы установки, нарушающие автоматическую установку PowerShell

Я устанавливаю SQL Data Tools через скрипт PowerShell. Я запускаю свой скрипт, но последняя часть, где установлены инструменты данных, завершается сбоем (внутри окна установщика SQL). Если я запускаю скрипт без этой части и устанавливаю Data Tools вручную, он работает.

Ошибка:

Ошибка установки VS Shell с кодом выхода -2147205120.

Части до этого устанавливают .NET и SQL Server Management Studio. Я не думаю, что они имеют отношение к моей проблеме, но я опубликую эту часть, если потребуется. Вот соответствующие части. Первый блок try устанавливает SQL SP1 (сейчас удален для удобочитаемости), второй устанавливает инструменты данных и SNAC_SDK.

try
{
    Write-Host "Lauching SQL Server Data Tools install ..."
    & "\\mynetworkpath\SSDTBI_x86_ENU.exe" "/ACTION=INSTALL" "/FEATURES=SSDTBI,SNAC_SDK" "/Q" "/IACCEPTSQLSERVERLICENSETERMS"
    Write-Host "Installer launched ..."
}
catch
{
    Write-Host "SQL Server Data Tools installation failed"
    exit
}

Я пробовал жонглировать аргументами для части установки Data Tools и играть с глаголом -wait, чтобы убедиться, что SP1 точно выполнен, но безуспешно.

EDIT: По предложению Мэтта я добавил /NORESTART в свой список аргументов, но теперь он ничего не устанавливает и не выдает ошибок...

EDIT: добавлен обновленный код с аргументами в кавычках. Все еще не работает, но я думаю, что это ближе, чем было изначально.


person jdope    schedule 15.05.2017    source источник
comment
Чтобы продолжить комментарий Мэтта, вот статья MSDN об этой ошибке   -  person BenH    schedule 15.05.2017
comment
@BenH Я действительно нашел эту статью во время устранения неполадок. Однако это не имеет смысла, поскольку, когда я выполняю автоматическую установку SP1, а затем вручную устанавливаю Data Tools, все работает, и мне не нужно перезагружаться.   -  person jdope    schedule 15.05.2017
comment
Невозможно сравнить установку вручную с использованием коммутаторов, так как параметры будут другими. Вы пытались вместо этого подавить сообщение о перезагрузке с помощью /norestart?   -  person Matt    schedule 15.05.2017
comment
@ Мэтт А! Я должен буду попробовать это. Я отчитаюсь.   -  person jdope    schedule 15.05.2017
comment
@Matt К сожалению, это не изменило результат :(   -  person jdope    schedule 16.05.2017


Ответы (1)


Я думаю, что виновником здесь является запятая в аргументах, потому что powershell интерпретирует объекты, разделенные запятой, как массив.

Вы можете увидеть, как параметры передаются с помощью этого небольшого хака

& { $args } /ACTION=INSTALL /FEATURES=SSDTBI,SNAC_SDK /Q /IACCEPTSQLSERVERLICENSETERMS

который дает

/ДЕЙСТВИЕ=УСТАНОВИТЬ

/FEATURES=SSDTBI

SNAC_SDK

/Q

/IACCEPTSQLSERVERLICENSETERMS

Чтобы избавиться от этой проблемы, вам нужно указать как минимум аргумент FEATURES. Я обычно цитирую все в таких случаях, просто чтобы быть последовательным, так что

& { $args } "/ACTION=INSTALL" "/FEATURES=SSDTBI,SNAC_SDK" "/Q" "/IACCEPTSQLSERVERLICENSETERMS"

дает вам желаемые параметры:

/ДЕЙСТВИЕ=УСТАНОВИТЬ

/FEATURES=SSDTBI,SNAC_SDK

/Q

/IACCEPTSQLSERVERLICENSETERMS

Обновление: многие установщики возвращаются сразу после того, как они были вызваны, в то время как процесс установки все еще выполняется в фоновом режиме, что может быть ошибкой, когда остальная часть скрипта зависит от установки.

Есть несколько способов заставить powershell ждать завершения процесса. Одним из самых коротких является использование Out-Null следующим образом:

& "\\mynetworkpath\SSDTBI_x86_ENU.exe" "/ACTION=INSTALL" "/FEATURES=SSDTBI,SNAC_SDK" "/Q" "/IACCEPTSQLSERVERLICENSETERMS" | Out-Null

Вы также можете просмотреть $? или $LASTEXITCODE, чтобы проверить наличие ошибок.

person TToni    schedule 15.05.2017
comment
Я проверяю приведенные аргументы прямо сейчас! Однако меня интересует Out-Null. Разве установка -Wait в моей установке SP1 не делает то же самое, заставляя установку Data Tools ждать, пока установка SP1 не будет завершена? - person jdope; 15.05.2017
comment
@jdope По сути, да. По его словам, существует множество способов заставить PowerShell ждать завершения выполнения команды. Вы могли бы так же легко использовать Start-Process -Path "\\mynetworkpath\SSDTBI_x86_ENU.exe" -Wait -ArgumentList "/ACTION=INSTALL","/FEATURES=SSDTBI,SNAC_SDK","/Q","/IACCEPTSQLSERVERLICENSETERMS"; - person Bacon Bits; 15.05.2017
comment
Хорошо, я попробовал & "\\mynetworkpath\SSDTBI_x86_ENU.exe" "/ACTION=INSTALL" "/FEATURES=SSDTBI,SNAC_SDK" "/Q" "/IACCEPTSQLSERVERLICENSETERMS" | Out-Null, и он установил Visual Studio, но не инструменты данных. Как-то странно. Работает... но не до конца. - person jdope; 15.05.2017
comment
Какую версию инструментов вы устанавливаете? Вы получаете справку по параметрам при вызове exe с /?? Можете ли вы найти или указать файл журнала для установки? - person TToni; 16.05.2017
comment
Установщик @TToni говорит, что версия 12.0.2344.23. Я не знаком с синтаксисом /?, но мне не удалось заставить его что-либо делать. Я нашел журнал, но в нем нет больше информации, которую я мог бы найти, кроме исходной ошибки, которую я опубликовал. - person jdope; 16.05.2017
comment
@jdope Есть ли конкретная причина, по которой вы не используете новейшие инструменты (msdn.microsoft. com/en-us/mt186501.aspx)? Насколько я знаю, они должны быть совместимы с предыдущими версиями. Кроме этого, я не уверен, как я мог бы помочь вам дальше, извините. - person TToni; 16.05.2017
comment
@TToni Он устанавливается на Windows Server 2012 R2, поэтому мне сказали использовать эту версию. Я думаю, что на самом деле это может быть проблема с самим установочным файлом (ошибка Microsoft), а не с PowerShell. Спасибо за вашу помощь, хотя, я ценю это. - person jdope; 16.05.2017