Jenkins自由风格任务:PowerShell从Git复制文件到Windows主机路径找不到问题排查
解决Jenkins PowerShell脚本无法找到工作区文件的问题
你的问题根源很明确:你在Invoke-Command里的Copy-Item是在目标远程服务器上执行的,而不是Jenkins代理机器。脚本里的.Solr_config会去远程服务器的当前工作目录(也就是执行PowerShell的用户文档文件夹)找文件,但Git拉取的文件明明在Jenkins的工作区里,远程机器当然找不到。
下面给你修正后的PowerShell脚本,完美适配你的Jenkins自由风格项目:
# 获取Jenkins工作区的绝对路径(Jenkins内置环境变量,直接用就行) $jenkinsWorkspace = $ENV:WORKSPACE # 拼接出Git拉取的Solr_config目录的完整路径 $sourceFolder = Join-Path -Path $jenkinsWorkspace -ChildPath "Solr_config" # 转换密文绑定的密码为安全字符串,创建凭证对象 $securePassword = ConvertTo-SecureString "$($ENV:loginPassword)" -AsPlainText -Force $remoteCredential = New-Object System.Management.Automation.PSCredential ($ENV:loginUsername, $securePassword) # 建立到远程Windows服务器的会话 $remoteSession = New-PSSession -ComputerName windows_Host_server -Credential $remoteCredential # 直接从Jenkins工作区复制文件到远程服务器的目标目录 Copy-Item -Path $sourceFolder -Destination "E:\install" -Recurse -Force -ToSession $remoteSession # 用完会话记得关闭,避免资源占用 Remove-PSSession -Session $remoteSession
关键细节说明:
$ENV:WORKSPACE是Jenkins自动注入的环境变量,精准指向当前任务的工作区根目录,Git拉取的所有文件都在这里,不用手动找路径。- 用
Join-Path拼接路径是PowerShell的规范写法,避免因路径分隔符(\)导致的错误。 -ToSession参数让Copy-Item直接从本地(Jenkins代理)复制文件到远程服务器,无需在远程机器上处理本地路径的问题。- 确保Jenkins代理机器能和目标Windows服务器正常通信,且你用的账号拥有远程服务器
E:\install目录的读写权限。
如果遇到权限相关的问题,可以尝试在New-PSSession时添加-EnableNetworkAccess参数,或者确认远程账号的权限配置。
内容的提问来源于stack exchange,提问作者ikdunby




