Я создал в 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/