Назад | Перейти на главную страницу

Вывод обрезается в задании Jenkins при удаленном запуске сценария PowerShell с помощью psexec

Я создал в Jenkins задание для запуска небольшого скрипта PowerShell на удаленном компьютере с помощью psexec. На этапе сборки я использую плагин powershell и запускаю следующую команду:

& "$env:SCRIPTROOT\test_psexec.ps1" -Username $env:USERNAME -Password $env:PASSWORD -Server $env:REMOTESERVER

В файле test_psexec.ps1 у меня есть код ниже:

$filePath = "C:\windows\temp\test_script.ps1"
$server = "server01"
$cmd = "powershell -NoLogo -NonInteractive -ExecutionPolicy Bypass -File $filePath"

Write-Host "Launching powershell on remote system using psexec..."
Write-Host "Command: & $PSScriptRoot\tools\psexec -accepteula -nobanner -u $username -p **** -h \\$server $cmd"

$output = & $PSScriptRoot\tools\psexec -accepteula -nobanner -u $username -p $password -h \\$server $cmd
Write-Host "Script Output: "
Write-Host $output

Файл test_script.ps1 содержит следующий сценарий:

Write-Host "Verifying if server is pending reboot..."

try {
  $regKey = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired"
  $regItems = Get-ItemProperty -Path $regKey -ErrorAction SilentlyContinue

  if($regItems) {
    Write-Host "Server has a reboot pending. Rebooting server..."
  } else {
    Write-Host "Server does not have a pending reboot."
  }
} catch {
  Write-Host "Failed to verify pending reboot or unable to restart server."
  Write-Host $_.Message
}

Задание выполняется успешно, но по какой-то причине вывод, который я отображаю из psexec в Jenkins, возвращает только одну строку. Я выполнил еще один тестовый сценарий на удаленном компьютере с кучей текста, и, похоже, он усекает вывод до 256 символов. Результат задания Jenkins похож на то, что показано ниже:

Started by user Test Account
Building in workspace D:\Jenkins\workspace\test_job
[test_job] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\windows\TEMP\jenkins3570507542870234918.ps1'"
Launching powershell on remote system using psexec...
Command: D:\test_job\tools\psexec.exe -accepteula -nobanner -u testdomain\test_acct -p **** -h \\server01 "powershell" -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\windows\temp\test_script.ps1
Connecting to server01...
Starting PSEXESVC service on server01...
Connecting with PsExec service on server01...
Starting powershell on server01...
powershell exited on server01 with error code 0.
Script Output: 
Verifying if server is pending reboot...
Execution successful.
Finished: SUCCESS

Если я вхожу в систему и запускаю сценарий на удаленном компьютере в PowerShell, я получаю соответствующий результат. Кроме того, я не запускаю psexec непосредственно в Jenkins, поскольку в этой части сценария test_psexec.ps1 есть другая логика, которая не имеет отношения к этой проблеме.

Кто-нибудь знает, достигаю ли я какого-то ограничения буфера или знаю параметр, который я могу настроить, чтобы избежать этой проблемы?

Причина, по которой это не работает для вас, заключается в том, что ваш второй скрипт использует Write-Host. Выход Write-Host не может быть перенаправлен; поэтому, когда вы выполняете этот скрипт удаленно, вывод теряется.

В вашем случае лучшая альтернатива - Write-Out который записывает объекты в выходной поток. Это должно работать нормально в данном конкретном случае, но имейте в виду, что запись дает неожиданные результаты при использовании в функции, которая должна возвращать другие результаты в выходной поток. (В Powershell возвращение значения из функции эквивалентно Write-Out.)

Другая альтернатива - Write-Verbose который запишет результаты в подробный поток. Чтобы увидеть эти результаты, вам нужно либо добавить -Verbose флаг для вызова вашего скрипта, или вы можете установить $VerbosePreference = $true чтобы установить его для вашей сессии.

Вот хорошая статья, в которой рассказывается о подводных камнях Write-Host: http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/