[pwsh] Write-Output, mesclagem de matriz e texto de linha única

Diretório de artigos

1. Perguntas

No powershell, às vezes, precisamos adicionar mais elementos a um array anterior, se adicionar um único objeto, precisamos apenas usar o operador +=. Mas quando queremos mesclar dois arrays de múltiplos objetos, precisamos percorrer para adicionar um array ao outro, o que é bastante complicado. Claro, você também pode usar o método no objeto Listor , mas a conversão de tipo também é necessária. Existe uma maneira mais limpa de mesclar dois ou mais arrays?ArrayListAddRange

2. Soluções

O Powershell gera diretamente objetos, percorrendo matrizes de objetos (podem ser fechados). No processamento de arrays, se você quiser usar índices, é recomendável usar tipos fortes para restrições. Por outro lado, se você deseja combinar matrizes, não precisa percorrer manualmente, pode usar diretamente $(;)a atribuição combinada de várias linhas de resultados de saída.

No powershell, os resultados de saída de várias expressões podem ser usados $()​​ou &{}resumidos e atribuídos a uma variável. Write-Output(alias echo) o documento de ajuda mostra 1 , sua função é enviar o objeto especificado para o console ou pipeline e percorrer a matriz por padrão. É claro que os parâmetros do switch também podem ser ativados -NoEnumeratepara passar todo o array para o pipeline. O comando está usando o método Cmdlet.WriteObject(object sendToPipeline, bool enumerateCollection)2 .

Crie arrays principalmente usando @()e ,. Usá-lo $(;)pode realizar a fusão de arrays e você também pode Write-Outputescolher se deseja percorrer o array. Como pode ser visto no código a seguir, embora os resultados de saída pareçam consistentes, suas estruturas são diferentes. Porque não importa quantos níveis de aninhamento o array tenha, ele eventualmente será recursivo em um array com uma profundidade de um.

$arr1 = [pscustomobject]@{
    
     FullName = "C:\temp"; Name = "temp" }
# FullName Name
# -------- ----
# C:\temp  temp
$arr2 = 1..3 | % {
    
     [pscustomobject]@{
    
     FullName = "C:\temp\file_$_"} }
# FullName
# --------
# C:\temp\file_1
# C:\temp\file_2
# C:\temp\file_3

$arr3 = @($arr1, $arr2) # 创建一个长度为2的数组
$arr3 = $arr1, $arr2    # 省略后的数组生成方式
$arr3 = $(echo $arr1 -NoEnumerate; echo $arr2 -NoEnumerate)
# 上式结果与前面的数组生成、使用+=操作符结果相一致

$arr4 = $($arr1; $arr2)
# 将echo枚举结果合并,赋值给新变量
# 该结果长度为4,$arr1 和 $arr2 都被 echo 所遍历
# 类似动态规划枚举节点树

Por outro lado, como WriteObject()um array com comprimento 1 é percorrido como um objeto interno, quando o array passa por um pipeline ou uma função para gerar um valor do tipo array, se você quiser manter a integridade do array, você precisa usar restrições de tipo forte ao atribuir valores. Por exemplo Get-Content, os resultados da maioria dos comandos são arrays.Ao encontrar uma única linha de texto, haverá problemas ao usar o índice para obter o valor . No entanto, pipelines e foreach não encontrarão tais problemas, então você pode usá-los com confiança.

$arr5 = @(1) | %{
    
     "line 1" }; $arr5.pstypenames
# System.String
# System.Object

# 使用强类型约束,[array]可以换为[<classType>[]]的形式
$arr5 = [array](@(1) | %{
    
     "line 1" })
[array]$arr5 = (@(1) | %{
    
     "line 1" })

3. Referência


  1. Get-Help Write-Output ↩︎

  2. Método Cmdlet.WriteObject ↩︎

Acho que você gosta

Origin blog.csdn.net/qq_41755979/article/details/105741385
Recomendado
Clasificación