PowerShell脚本触发Jenkins作业报错求助:远程解析失败与空引用异常
问题:PowerShell触发Jenkins作业时出现错误
脚本内容
$UserName = "user" $Password = "password" $API_URL = "https://jenkinsservername" $JobName = "firstjob" $JobToken = "generatedtoken" $header = @{} $header.Add('Authorization', 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$(${UserName}):$(${Password})"))) $Params = @{uri = "${API_URL}/crumbIssuer/api/json"; Method = 'Get'; Headers = $header;} $API_Crumb = Invoke-RestMethod @Params write-host $API_Crumb $h.Add('Jenkins-Crumb', $API_Crumb.crumb) $Params['uri'] = "https://jenkinsservername/$JobName/build?token=$JobToken" $Params['Method'] = 'Post' $Params['Headers'] = $header Invoke-RestMethod @Params
执行错误信息
Invoke-RestMethod : 远程名称无法解析: 'https'
At C:\path\to\script.ps1:12 char:14
- $API_Crumb = Invoke-RestMethod @Params1
~~~~~~~~~~~~~~~~~~~~~~~~~~
- CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
- FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
Invoke-RestMethod : 对象引用未设置到对象的实例。
At C:\path\to\script.ps1:19 char:1
- Invoke-RestMethod @Params2 -WebSession $Session
- CategoryInfo : NotSpecified: (:) [Invoke-RestMethod], NullReferenceException
- FullyQualifiedErrorId : System.NullReferenceException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
解决方案
1. 解决“远程名称无法解析: 'https'”错误
- 替换占位符:
$API_URL里的jenkinsservername是占位符,必须换成Jenkins服务器实际的域名、IP或带端口的完整可访问URL,比如https://jenkins.example.com或https://192.168.1.100:8080(Jenkins非默认443端口时需补充端口) - 验证网络连通性:在运行脚本的机器上,执行
Test-NetConnection 你的Jenkins服务器地址 -Port 对应端口,确认能正常连接到Jenkins服务 - 检查URL格式:确保
$API_URL无多余空格、拼写错误,不要漏写https://前缀
2. 解决“对象引用未设置到对象的实例”错误
脚本中$h.Add('Jenkins-Crumb', $API_Crumb.crumb)的$h是未定义变量,需替换为之前创建的$header变量;同时建议复用$API_URL变量避免硬编码重复URL,修改后对应代码如下:
$header.Add('Jenkins-Crumb', $API_Crumb.crumb) $Params['uri'] = "${API_URL}/${JobName}/build?token=$JobToken"
优化后的完整脚本
$UserName = "你的实际用户名" $Password = "你的实际密码" $API_URL = "https://你的Jenkins服务器地址:端口" # 替换为真实Jenkins地址 $JobName = "firstjob" $JobToken = "你的生成令牌" $header = @{} $authString = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$UserName`:$Password")) $header.Add('Authorization', "Basic $authString") # 获取Crumb $Params = @{ uri = "${API_URL}/crumbIssuer/api/json" Method = 'Get' Headers = $header } $API_Crumb = Invoke-RestMethod @Params $header.Add('Jenkins-Crumb', $API_Crumb.crumb) # 触发Jenkins作业 $Params['uri'] = "${API_URL}/${JobName}/build?token=$JobToken" $Params['Method'] = 'Post' Invoke-RestMethod @Params
内容的提问来源于stack exchange,提问作者user17095978
相关产品推荐
相关产品推荐

