У меня есть массивный (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.
Главный пост, обновленный, с помощью члена получил большинство из его разработанных, однако работает на, казалось бы, один последний барьер. – Ilya