Запустите интерактивный "мастер" сценарий 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, чтобы получить выходные данные каждого из фоновых заданий по завершении.

Другие вопросы по тегам