2016-02-16 1 views
1

У меня есть массивный (983-строчный) интерактивный сценарий PowerShell, который я написал для управления практически всеми аспектами локального сервера. У меня есть текстовый файл со списком серверов. Я хочу сойти с ума.Запустить интерактивный скрипт 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 пакетных файлов на своих серверах

Пример:

я запускаю скрипт на сервере «Master», и есть 10 других серверов в текстовом файле. Сначала скрипт работает только на главном сервере. Как только я выбираю вариант 6, выполняется команда для выполнения одних и тех же команд на всех 11 серверах (мастер + 10 других).

Я знаю, как запускать один и тот же сценарий на серверах, если бы он произнес простую копию файла или сброс службы (без взаимодействия с пользователем), используя такие вещи, как invoke-command или enter-pssession и т. Д. Однако, в моем случае я ' ll должны удаляться на каждый сервер, потому что он является интерактивным ... если не существует способа сделать это?

Также, если возможно, включите ведение журнала, чтобы я мог подтвердить, что каждый компьютер запускал скрипт и все делал успешно. Прямо сейчас, у меня есть это, начинаю транскрипцию и останавливаясь в конце. Работает отлично на месте.

Любая помощь будет оценена по достоинству.

обновление: 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 ) в функции ... любезно Cobster.

+0

Главный пост, обновленный, с помощью члена получил большинство из его разработанных, однако работает на, казалось бы, один последний барьер. – Ilya

ответ

1

Invoke-Command можно запускать в фоновом режиме с помощью переключателя -AsJob.

Регистрация также возможна с помощью командлета Receive-Job для получения результатов каждого из фоновых заданий после завершения.

+0

Спасибо @Cobster. Я, наконец, обошел эту попытку (временно был на другой проект). Когда я запускаю следующую команду, она, похоже, ничего не делает. Это не ошибка, но на самом деле она не запускает функцию резервного копирования, например. Invoke-Command -ComputerName $ Servers -ScriptBlock $ {function: Backup} -AsJob – Ilya

+0

Есть ли какой-либо результат или ошибки при вызове 'Receive-Job' на этих заданиях? – Cobster

+0

Я выполнил следующее из моего мастер-скрипта @Cobster ... Я выбрал вариант 1 (для создания резервной копии). '$ s = New-PSSession -ComputerName $ Servers', за которым следует' $ j = Invoke-Command -Session $ s -ScriptBlock {Start-Job -ScriptBlock $ {function: Backup}} ', за которым следуют' $ j' и затем '$ results = Invoke-Command -Session $ s -ScriptBlock {param ($ j) Recieve-Job -Job $ j} -ArgumentList $ j'. Я получил сообщение об ошибке: ** Не могу связать аргумент с параметром «ScriptBlock», потому что он равен нулю. ** Это появилось дважды, за ним следует сообщение о том, что ** «Получить-Job» не является допустимым командлетом ** для каждого сервера (2 всего прямо сейчас) – Ilya

Смежные вопросы