Запустите интерактивный "мастер" сценарий PowerShell на локальном ПК, а также на удаленных ПК и войдите в систему.
У меня есть массивный (983 строчка) интерактивный скрипт PowerShell, который я написал для управления практически всеми аспектами локального сервера. У меня есть текстовый файл со списком серверов. Я хочу сойти с ума от этого.
Содержание текстового файла:
Server1Name
Server2Name
Интерактивное меню PowerShell:
Write-Host "Welcome to the environment control script."
Write-Host " "
Write-Host "What would you like to do? Select the number:"
Write-Host "========================================================================="
Write-Host "1. Create a backup of the environment (existing servers)"
Write-Host "2. Backup environment and deploy updated environment (existing servers)"
Write-Host "3. Deploy new environment including IIS (clean servers)"
Write-Host "4. Deploy just IIS (clean servers)"
Write-Host "5. Remove Build w/ backup and cleanup IIS (existing servers)"
Write-Host "6. Remove Build w/out backup and cleanup IIS (existing servers)"
Write-Host "7. Remove and cleanup only IIS (existing servers)"
Write-Host "8. Deploy new DLL's (existing servers)"
Write-Host "9. [EXIT]" -foregroundcolor "yellow"
Write-Host " "
Цель:
Попытка уйти от наличия 1000 командных файлов на моих серверах
Пример:
Я запускаю скрипт на сервере "Мастер" и в текстовом файле есть еще 10 серверов. Сначала скрипт выполняется ТОЛЬКО на главном сервере. Как только я выбрал опцию 6, запускается команда для выполнения одних и тех же команд на всех 11 серверах (мастер + 10 других).
Я знаю, как запустить один и тот же сценарий на серверах, если бы это было, скажем, простое копирование файла или сброс службы (без взаимодействия с пользователем), используя такие вещи, как invoke-command
или же enter-pssession
и т. д... однако в моем случае мне придется удаленно подключаться к каждому серверу, потому что он интерактивный... разве есть способ сделать это?
Также, если возможно, включите ведение журнала, чтобы я мог подтвердить, что на каждом компьютере был запущен сценарий и все прошло успешно. Прямо сейчас у меня это начинается стенограмма и останавливается в конце. Прекрасно работает на местном уровне.
Любая помощь будет оценена.
Обновление: 3/8/16
Итак, @Cobster помог мне, и мы на 99%.
Используя следующий код, похоже, что скрипт пытается запуститься, однако есть еще одна проблема.
$sessions = New-PSSession -ComputerName $servers
$job = Invoke-Command -Session $sessions -ScriptBlock ${function:Backup} -AsJob
If you want a different job for each machine, you can do the following:
$jobs = $sessions | ForEach-Object { Invoke-Command -Session $_ -ScriptBlock ${function:Backup} -AsJob }
Wait-Job -Job $jobs
Проблема в том, что когда это сделано, команда invoke, кажется, не импортирует все мои ранее объявленные переменные вверху моего скрипта (который включает в себя практически ВСЕ мои пути и т. Д., Потому что они не определены в этой функции,
Это приводит к куче таких типов ошибок (7, если быть точным, по одной на каждую из моих проверок пути тестирования перед выполнением шага):
Cannot bind argument to parameter 'Path' because it is null.
+ CategoryInfo : InvalidData: (:) [Test-Path], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.TestPathCommand
+ PSComputerName : *ServerName*
Решение:
использование -ArgumentList $variable1, $variable2
в invoke-command
а также
param
(
$variable1,
$variable2
)
метод в рамках функции... любезно Кобстер.
1 ответ
Invoke-Command можно запустить в фоновом режиме с помощью ключа -AsJob.
Ведение журнала также возможно с помощью командлета Receive-Job, чтобы получить выходные данные каждого из фоновых заданий по завершении.