2016-03-16 3 views
0

Пробовал решить эту проблему немного и, похоже, не понял ее.PowerShell Invoke-Command возвращает пустые данные?

У меня есть следующий сценарий:

$Servers = Get-Content -Path "C:\Utilities_PowerShell\ServerList.txt" 
$IISServiceName1 = 'W3SVC' 
$IISServiceName2 = 'IISAdmin' 
$IISServiceName3 = 'WAS' 
$IISarrService = Get-Service -Name $IISServiceName1,$IISServiceName2,$IISServiceName3 
$IISarrServiceCheck = Get-Service -Name $IISServiceName1,$IISServiceName2,$IISServiceName3 -ErrorAction SilentlyContinue -ErrorVariable NoService 

function IISServiceStatus # Checks for status of IIS services 
{ 
    param (
    $IISServiceName1, 
    $IISServiceName2, 
    $IISServiceName3, 
    $IISarrService, 
    $IISarrServiceCheck 
    ) 

    if (Get-Service -Name $IISServiceName1,$IISServiceName2,$IISServiceName3) 
    { 
     Write-Host "Status of IIS service(s) on $env:ComputerName :" 
     Get-Service -Name $IISServiceName1,$IISServiceName2,$IISServiceName3 | Select Name,DisplayName,Status | Format-Table -AutoSize 
    } 
    else 
    { 
     Write-Host " No IIS service(s) were found..." -foreground "red" 
    } 
} 

$Sessions = New-PSSession -ComputerName $Servers 
$EndJobs = $Sessions | ForEach-Object { 
    Invoke-Command -Session $_ -ScriptBlock ${function:IISServiceStatus} -AsJob -ArgumentList $IISServiceName1, $IISServiceName2, $IISServiceName3, $IISarrService, $IISarrServiceCheck | Wait-Job | Receive-Job 
    Write-Host " " 
} 

Всякий раз, когда я запускаю его, все это я получаю выход:

Status of IIS service(s) on *PC* : 

Если я запускаю функцию вне цикла/Invoke-Command , результаты абсолютно идеальны. Что случилось с моим удаленным циклом?

Я попытался положить переменные внутри функции, я попытался запустить взывать-команду без списка аргументов, и т.д.

Update: 3/17/16

Оказывается. ..если я запускаю свой фактический скрипт как есть, результат $EndJobs странный, поскольку он выводит ВСЕ сервисы в одной таблице, а затем три службы IIS в другой таблице. Это объясняет, почему, когда я запускаю скрипт-скрипт invoke-command (stopIIS) ... Мне пришлось перезагрузить весь сервер, потому что он потерял все сервисы.

Эти функции выполняются ИСПОЛЬЗОВАТЬСЯ, если не выполняются с помощью команды remote/invoke.

Что за черт ... invoke-command серьезно закручивает мои вещи!

У кого-нибудь есть идеи/советы о том, как я могу запустить свой локальный скрипт (который работает на 100%) на множестве серверов из текстового файла без каких-либо странных проблем? Является ли invoke-command единственным способом?

+0

Что такое значение $ EndJobs после вызова вашего кода? – PetSerAl

+0

Значение верно, @PetSerAl, если я вывожу '$ EndJobs' после запуска моего кода. Как я уже говорил ниже, у меня есть множество других функций, называемых с использованием одного и того же метода invoke-command, и они работают нормально ... единственное, что не было, это тот. Я не понимаю, почему этот результат не будет выводить, как и все остальные. – Ilya

+0

На самом деле, @PetSerAl, я стою исправлено. Если я запускаю свой фактический скрипт как есть, результат '$ EndJobs' странный, поскольку он выводит ВСЕ сервисы в одной таблице, а затем три службы IIS в другой таблице. Это объясняет, почему, когда я запускаю скрипт invoke-command (stopIIS), мне приходилось перезагружать весь сервер, потому что он потерял все сервисы. Эти функции выполняются ИСПОЛЬЗОВАТЬСЯ, если они не запускаются с помощью команды remote/invoke-command. Что за черт ... invoke-command серьезно прикручивает мои вещи! – Ilya

ответ

1

Есть ли у вас такая же проблема, если вы завернете все это в блок сценариев?

$Servers = Get-Content 'C:\Utilities_PowerShell\ServerList.txt' 

$Sessions = New-PSSession -ComputerName $Servers 

$EndJobs = $Sessions | ForEach-Object { 
    Invoke-Command -Session $_ -ScriptBlock { 
     $IISServiceName1 = 'W3SVC' 
     $IISServiceName2 = 'IISAdmin' 
     $IISServiceName3 = 'WAS' 
     $IISarrService = Get-Service -Name $IISServiceName1,$IISServiceName2,$IISServiceName3 
     $IISarrServiceCheck = Get-Service -Name $IISServiceName1,$IISServiceName2,$IISServiceName3 -ErrorAction SilentlyContinue -ErrorVariable NoService 

     function IISServiceStatus { # Checks for status of IIS services 
      param (
       $IISServiceName1, 
       $IISServiceName2, 
       $IISServiceName3, 
       $IISarrService, 
       $IISarrServiceCheck 
      ) 

      if (Get-Service -Name $IISServiceName1,$IISServiceName2,$IISServiceName3) { 
       Write-Host "Status of IIS service(s) on $env:ComputerName :" 
       Get-Service -Name $IISServiceName1,$IISServiceName2,$IISServiceName3 | Select Name,DisplayName,Status | Format-Table -AutoSize 
      } else { 
       Write-Host ' No IIS service(s) were found...' -ForegroundColor Red 
      } 
     } 

     IISServiceStatus $IISServiceName1 $IISServiceName2 $IISServiceName3 $IISarrService $IISarrServiceCheck 
    } -AsJob | Wait-Job | Receive-Job 
    Write-Host ' ' 
} 

$EndJobs 
+0

Это сработало, @ Энтони Стрингер. Можете ли вы объяснить, почему? В принципе, я вызываю эту функцию в разное время в моем скрипте (мой скрипт на самом деле довольно массивный, это крошечный 1% -ный фрагмент) ... мои другие функции, которые вызывается с помощью простой invoke-command $ (function : name) нет проблем с запуском ... только этот конкретный IISStatus one ... – Ilya

+0

Я бы хотел, но я не знаком с '$ {function: IISServiceStatus}'. возможно, кто-то другой может объяснить эту проблему. –

+0

По-прежнему ценим это ... В худшем случае я буду использовать его, хотя это не обязательно чистое решение. Спасибо, что нашли время! @ Энтони Стрингер. – Ilya

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