【问题标题】:-split ' ' that works locally in Powershell does not work in a Azure pipeline Powershell task-split ' ' 在 Powershell 中本地工作在 Azure 管道 Powershell 任务中不起作用
【发布时间】:2019-06-26 14:11:28
【问题描述】:

我正在使用 git diff 命令来获取在最后 2 次提交之间更改的文件,并且根据操作必须对文件执行不同的操作。所以我必须提取对文件和文件名的操作。

对于重命名的文件:

git diff 命令的结果如下,它是一个从swaggerA.json 重命名为swaggerB.json 的swagger 文件

R100 swaggerA.json swaggerB.json

这是我的代码:

$files=$(git diff HEAD~ HEAD --name-status) 
$temp=$files -split ' '
echo $temp 
echo $temp.Length
$name=$temp[1]
echo "this is $name file"
write-host $name 
$output=$name.Split(' ')
$length=$output.Length
$output[0] 
$output[1] 
$output[$length-1]

上述脚本应该在理想情况下拆分并提供 3 个部分:

1) R100

2) swaggerAjson

3) swaggerB.json

但在 Azure 管道的 Powershell 任务中并没有这样做,并且每次都给出整个字符串。

【问题讨论】:

  • 我不太明白您尝试将$name 变量(现在应该存储swaggerA.json)拆分为新变量$output 的部分。这将产生一个单元素字符串数组swaggerA.json。这应该是函数的返回值吗?如果是这样,只需执行return ,$temp。 (注意一元逗号运算符)

标签: git powershell azure-devops azure-pipelines


【解决方案1】:

git diff [cid]..[cid] --name-status 输出以制表符分隔的值的行,因此在正常空间上拆分对您没有帮助:

$changes = git diff HEAD~ HEAD --name-status |ForEach-Object {
    # split on tab "`t"
    $change,$orig,$new = $_ -split "`t"
    [pscustomobject]@{
        Change = $change
        Original = $orig
        Current = $new
    }
}

【讨论】:

  • 谢谢!输出是制表符分隔的值,需要在 `t 上拆分有助于拆分该字符串。
【解决方案2】:

因为 gid diff 返回一个带有隐藏 ASCII 符号 (`t) 的字符串,如果我们将结果复制到 Notepad++(并在设置中按下“显示所有字符”),我们可以看到它:

所以我们需要在拆分前将其替换为常规空格:

$files = $files -replace '[^\p{L}\p{Nd}/(/./_]', ' '

现在它可以工作了,你会得到拆分的字符串:)

【讨论】:

  • 谢谢!需要使用 `t 来拆分字符串!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 2020-08-27
相关资源
最近更新 更多