如何在 powershell 中使用分隔符连接和连接字符串数组?

And*_*ein 5 arrays string powershell concatenation pester

PS C:\Users\User\ps-modules> 更多 .\MyStrings.Tests.ps1

function slist { "1", "2", "3" }

Describe 'StringTests' {

  It 'literal -join' {
    "1", "2", "3" -join "," | Should -Be "1,2,3"
  }

  It 'literal -join' {
    @("1", "2", "3") -join "," | Should -Be "1,2,3"
  }

  It 'slist returns a list of string' {
    slist | Should -Be @("1", "2", "3")
  }

  It 'slist -join' {
    slist -join "," | Should -Be "1,2,3"
  }

}
Run Code Online (Sandbox Code Playgroud)

PS C:\Users\User\ps-modules> pwsh .\MyStrings.Tests.ps1

Starting discovery in 1 files.
Discovery found 4 tests in 169ms.
Running tests.
[-] StringTests.slist -join 55ms (53ms|2ms)
 Expected '1,2,3', but got @('1', '2', '3').
 at slist -join "," | Should -Be "1,2,3", C:\Users\User\ps-modules\MyStrings.Tests.ps1:17
 at <ScriptBlock>, C:\Users\User\ps-modules\MyStrings.Tests.ps1:17
Tests completed in 731ms
Tests Passed: 3, Failed: 1, Skipped: 0 NotRun: 0
Run Code Online (Sandbox Code Playgroud)

为什么来自函数返回的数组与字面上声明的数组的处理方式不同?

San*_*zon 11

-join ','被解释为传递给slist函数的参数,通过这个轻微的修改,我们可以更好地看到它:

function slist { "1", "2", "3" + $args }
slist -join ","
Run Code Online (Sandbox Code Playgroud)

哪个输出:

function slist { "1", "2", "3" + $args }
slist -join ","
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要使用分组运算符( ),如文档中所述:

(...)允许您让命令的输出参与表达式。

(slist) -join "," -eq '1,2,3' # True
Run Code Online (Sandbox Code Playgroud)

作为PowerShell 6.2+中的替代方案,您可以使用Join-String

slist | Join-String -Separator ','
Run Code Online (Sandbox Code Playgroud)