运行互动'掌握'本地PC上的PowerShell脚本以及远程PC和日志

时间:2016-02-16 18:04:19

标签: powershell server interactive administration

我有一个庞大的(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个批处理文件

示例:

我在" Master"上运行脚本服务器,文本文件中还有10个其他服务器。首先,该脚本仅在主服务器上运行。一旦我选择了选项6,就会运行一个命令在所有11个服务器(master + 10个其他服务器)上执行相同的命令。

我知道如何使用invoke-commandenter-pssession之类的东西来说明如何在服务器上运行相同的脚本,如果说是简单的文件复制或服务重置(没有来自用户的交互)......但是,在我的情况下,我必须远程访问每个服务器,因为它是交互式的......除非有办法做到这一点?

此外,如果可能,启用日志记录,以便我可以确认每台PC都运行脚本并成功完成所有操作。现在,我有它开始成绩单并在结束时停止。在当地很好用。

任何帮助都将不胜感激。

更新: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-command似乎无法在我的脚本顶部导入我之前声明的所有变量(实际上包括我的所有路径等等,因为它们是没有在该函数中定义。

这导致了大量这些类型的错误(确切地说是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提供。

1 个答案:

答案 0 :(得分:1)

Invoke-Command可以使用-AsJob开关在后台运行。

也可以使用Receive-Job cmdlet在完成后获取每个后台作业的输出。