我在 Jenkins 中创建了一个作业,使用 psexec 在远程机器上启动一个小型 powershell 脚本。在我的构建步骤中,我使用 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
}
作业成功执行,但出于某种原因,我从 Jenkins 中的 psexec 显示的输出仅返回一行。我在远程计算机上执行了另一个包含大量文本的测试脚本,它似乎将输出截断为 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 中启动脚本,我会得到相应的输出。另外,我不会直接在 Jenkins 中启动 psexec,因为 test_psexec.ps1 脚本的这一部分还有其他逻辑,与此问题无关。
是否有人知道我是否达到了某种缓冲区限制或知道我可以配置哪些设置来避免此问题?
答案1
这对您不起作用的原因是因为您的第二个脚本正在使用Write-Host
。的输出Write-Host
无法重定向;因此当您远程执行该脚本时,输出将丢失。
就您而言,最好的替代方案是Write-Out
将对象写入输出流。在这种特定情况下,这应该可以正常工作,但请注意,在需要将其他结果返回到输出流的函数中使用 Write-Out 时会产生意外结果。(在 Powershell 中,从函数返回值相当于Write-Out
。)
另一种方法是Write-Verbose
将结果写入详细流。要查看这些结果,您需要将标志添加-Verbose
到脚本调用中,或者可以将$VerbosePreference = $true
其设置为会话。
这是一篇很好的文章,讨论了以下陷阱Write-Host
:http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/