У меня есть массивный (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
и т. д.... однако в моем случае мне придется удаленно на каждый сервер, потому что он интерактивный... если нет способа сделать это?
Кроме того, если возможно, включите ведение журнала, чтобы я мог подтвердить, что на каждом ПК запустился сценарий и все было выполнено успешно. Прямо сейчас я запускаю стенограмму и останавливаюсь в конце. Отлично работает локально.
Любая помощь будет оценена по достоинству.
Обновление: 08.03.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
)
внутри функции... любезно предоставлено Cobster.