ARM模板部署:VSTS PowerShell任务执行Get-Content时遇路径未找到错误
解决VSTS PowerShell任务中读取manifest.json的PathNotFound错误
我之前也碰到过一模一样的问题——本地跑PowerShell脚本完全正常,一放到Azure DevOps(原VSTS)的PowerShell任务里就报路径找不到。核心原因还是本地环境和代理机器的工作目录、文件结构不匹配,给你几个实用的排查和解决方向:
1. 用脚本所在目录构建绝对路径,避开相对路径陷阱
本地运行时,你的工作目录大概率和脚本所在目录一致,但VSTS代理的默认工作目录是流水线的根目录(比如你报错里的C:\XX_work\r7\a\CIBuild\drop\),不是脚本所在的子目录。直接用./manifest.json会在代理的根目录找文件,自然找不到。
修改脚本,用$PSScriptRoot(PowerShell 3.0及以上支持)获取脚本的绝对路径,再拼接manifest.json的路径:
# 获取当前脚本所在的绝对目录 $scriptDirectory = $PSScriptRoot # 拼接manifest.json的完整路径 $manifestFilePath = Join-Path -Path $scriptDirectory -ChildPath "manifest.json" # 读取并转换JSON $manifestDetails = Get-Content $manifestFilePath | ConvertFrom-Json
2. 确认流水线是否正确复制了manifest.json文件
如果代理机器的drop目录里根本没有manifest.json,那肯定会报错。检查你的CI/CD流水线:
- 查看Copy Files任务的源设置,确保包含了
manifest.json(比如源设为**/manifest.json,或者明确指定脚本所在目录下的该文件) - 确认Publish Build Artifacts任务把包含manifest.json的目录发布到了drop中,这样发布阶段的代理才能拿到这个文件
3. 检查PowerShell任务的工作目录配置
在VSTS的PowerShell任务设置里,有个「工作目录」选项:
- 如果这个选项填了值,脚本里的相对路径会基于这个目录,而不是脚本所在目录
- 可以把「工作目录」设置为脚本所在的路径(比如
$(System.DefaultWorkingDirectory)/CIBuild/drop/XX/XX/Deployment),或者直接用前面的绝对路径方法彻底避开这个问题
4. 加日志调试路径问题
如果还是找不到问题,可以在脚本里加几行日志,输出当前工作目录和脚本目录:
Write-Host "当前工作目录: $PWD" Write-Host "脚本所在目录: $PSScriptRoot" Write-Host "尝试读取的manifest路径: $manifestFilePath"
然后查看流水线的运行日志,就能清楚看到代理机器上的实际路径,对比manifest.json的实际位置调整路径即可。
内容的提问来源于stack exchange,提问作者Mani
相关产品推荐
相关产品推荐

