Все новое для Powershell и попытка написать сценарий, который может выполнять автоматическую установку Visual Studio 2017 на удаленном сервере с настраиваемым путем установки и настраиваемыми компонентами с помощью Invoke-Command и его параметра -ScriptBlock. Можно установить визуальную студию в автоматическом режиме, но без указания пути установки и списка настраиваемых компонентов, поскольку я не уверен, как передавать аргументы для этого. Пробовал различные Пилы, нигде не помогло.
парам (
$session = "New-PSSession -ComputerName $server -Credential $mycredentials",
$SourceFile = "\\server\D$\Somefolder\vs.exe",
$Destination = "D:\Somefolder\"
)
Write-Host "Installing Visual Studio"
Copy-Item -FromSession $session -Path $SourceFile -Destination $destination -Force
Invoke-Command -Session $session -ScriptBlock { Start-Process $Destination\vs.exe -ArgumentList '--quiet', '--installPath "C\VS\"' -Wait
}
Exit-PSSession
Пробовал разные варианты пути установки, например --installPath "D: \ Somefolder \", -installPath "D: \ Somefolder \", -install 'D: \ Somefolder \', даже думал о передаче аргументов через переменную, но не уверен, как будет ли работать в этом сценарии. Следовательно, он приземлился здесь безуспешно и даже нигде не увидел помощи, характерной для этого сценария.
@Theo: Хотя использование Join-Path
является хорошей рекомендацией, обратите внимание, что \\
(или //
) в качестве разделителей в путях действительно работают.
Просто хочу сказать, что, пока вы может выполняете удаленную установку программы через Powershell, в зависимости от того, как часто вам нужно это делать в своей среде, это не будет хорошо масштабироваться и является возможной причиной для рассмотрения реализации решения для управления конфигурацией. .
Попробуйте что-то вроде следующего (непроверенного) - обратите внимание на комментарии, относящиеся к тому, что вы пробовали:
param (
# Use $(...) to use a command's output as a parameter default value.
# By contrast assigning "..." only assigns a *string*.
$session = $(New-PSSession -ComputerName $server -Credential $mycredentials),
# To be safe, better to `-escape $ inside "..." if it's meant to be a literal.
$SourceFile = "\\server\D`$\Somefolder\vs.exe",
$Destination = "D:\Somefolder"
)
Write-Host "Installing Visual Studio"
Copy-Item -FromSession $session -Path $SourceFile -Destination $destination -Force
# You don't need the session anymore now that you've copied the file.
# Normally you'd call
# Remove-PSSession $session
# However, given that the session may have been passed as an argument, the caller
# may still need it.
# With the installer present on the local machine, you can invoke
# Start-Process locally - no need for a session.
Start-Process -Wait $Destination\vs.exe -ArgumentList '--quiet', '--installPath "C:\VS"'
# No need for Exit-PSSession (which is a no-op here), given that
# you haven't used Enter-PSSession.
Я думаю, что
$Destination\vs.exe
ошибочен, потому что $ Destination уже заканчивается обратной косой чертой, поэтому вы получитеD:\SomeFolder\\vs.exe
. Чтобы избежать подобных вещей, лучше используйте$exeToRun = Join-Path $Destination "vs.exe"
и используйте его (как вStart-Process -FilePath $exeToRun
). Кроме того, ваш код показывает неверный путь для аргументаinstallPath
. В нем отсутствует двоеточие, и он должен быть `C: \ VS`