Azure devops-更新json文件-powershell脚本

Azure devops-更新json文件-powershell脚本,powershell,azure-devops,azure-powershell,Powershell,Azure Devops,Azure Powershell,我创建了powershell脚本,用变量更新json文件。Json文件位于Azure devops repo中,Json文件名为var.Json。 我将在azure devops中使用此解决方案,因此我构建了管道并在azure devops的变量选项卡中设置了测试变量: 在我的脚本中,我有param和variables块,如下所示: param( [Parameter (Mandatory=$true)] [String] $FileRes ) #env variable $P

我创建了powershell脚本,用变量更新json文件。Json文件位于Azure devops repo中,Json文件名为var.Json。 我将在azure devops中使用此解决方案,因此我构建了管道并在azure devops的变量选项卡中设置了测试变量:

在我的脚本中,我有param和variables块,如下所示:

param(
    [Parameter (Mandatory=$true)]
    [String] $FileRes
)
#env variable
$Path = $Env:BUILD_SOURCESDIRECTORY

# Download variables from Json file
$JsonBase = @()
$JsonPath = "$Path\Var.json"
$JsonBase = Get-Content $JsonPath | out-string | ConvertFrom-Json

$JsonBase.FileNames[0].value = $FileRes
在我的脚本中,我使用命令:
$JsonBase | ConvertTo Json | Set Content-Path$JsonPath
将输出定向到Json文件

Json文件结构:

{
    "FileNames":  [
                      {
                          "value":  "AAAbbbccc123",
                          "value1":  "www",
                          "value3":  "swd",
                          "value4":  "xvb"
                      }
                  ]
}

管道末尾的状态是ok,所有步骤都是绿色的,但var.json文件并没有按照我的要求进行更新。仍然有旧值-->
“value”:“aaabbbcc123”

事实上,它已被替换,但您需要在输出回购中看到此更改

更清楚地说,您可以使用私有代理运行此构建。然后在构建完成后,转到相应的本地repo并检查
Var.json
文件:

在脚本中,您将
将内容设置到
$(Build.SourcesDirectory)\Var.json
下的文件中,而不是存储在
VSTS repos
中的文件中。因此,要检查是否成功更换,请转到代理中的
输出回购

有时,如果使用的是hosted agent,则可能无法查看详细的输出repo,因为在管道完成后,服务器将回收主机映像

此时,您可以在其中添加另一个脚本来打印JSON文件内容,然后您可以检查它是否被成功替换:

$content= Get-Content -Path $JsonPath
Write-Host $content


此外,请对您的脚本进行一些更改:

$JsonBase.FileNames[0].value = "$(FileRes)"
这里请使用
$(FileRes)
而不是
$FileRes
,因为您在变量选项卡中指定了值。不要忘记双引号

更新:

要将输出repos更改同步回VSTS repos,请尝试执行以下操作:

(1) 第一个命令行任务:

git config --global user.email "xxx@xx.com"
git config --global user.name "Merlin"

cd $(Build.SourcesDirectory)
git init
(2) 在powershell任务中,执行
set content
script

(3) 在第二个命令行任务中,执行
gitpush
以推送更改:

git add Var.json
git commit -m "aaaa"
git remote rm origin
git remote add origin https://xxx@dev.azure.com/xxx/xxx/_git/xxxx
git push -u origin HEAD:master


此外,要在管道中成功运行git脚本。除了启用“允许脚本访问…”之外,您还应该遵循此操作

如果将其更改为
“test”| ConvertTo Json | Set Content-Path$JsonPath
?在这种情况下,脚本将覆盖Json文件内容,Json文件的内容将是“test”。很好,因此,设置文件内容的行可以工作并正在执行。这只能意味着一件事,更改数据的行没有被执行,或者没有按照您认为的那样执行。当我尝试使用您在这里提供的示例代码时,它是有效的。这意味着你们真正的代码和你们这里的问题不同。问题是我也测试了这段代码,在我的笔记本电脑上,它很有效。它在azure devops上不起作用。@Tomalak-您是在azure devops上测试代码还是在本地测试代码?为了将json文件更改推送到devops Repo,我决定在我的管道中添加单独的任务powershell任务。在内联脚本部分,我粘贴了演示代码:git config--global user.email“xxx@no-mail.com“git config--global user.name“xxx”git add var.json git commit-m“json file update”git push。我使用了选项:“允许脚本访问OAuth令牌”,但由于出现错误。这个git代码块是正确的,还是我应该添加一些东西?@tester81看起来很有意义。它完全成功了吗?还是出了点问题,这次使用的是git代码block@tester81您的脚本块中缺少某些内容。已使用此更新我的答案,请检查我的更新答案。我添加了所有必需的权限,使用了链接-。我已按照您的建议创建了CMD任务,第一个和第二个任务已成功完成,但第三个任务以问题-->“致命:无法读取“”的用户名:终端提示已禁用”结束。我的第一个任务包含以下行:git config--global user.email“agent@no-mail.com“git config--global user.name“Robot Agent”cd$(Build.SourcesDirectory)git init