PowerShell 中是不是有字符串连接快捷方式?

Posted

技术标签:

【中文标题】PowerShell 中是不是有字符串连接快捷方式?【英文标题】:Is there a string concatenation shortcut in PowerShell?PowerShell 中是否有字符串连接快捷方式? 【发布时间】:2014-02-09 23:15:24 【问题描述】:

喜欢数字吗?

例如,

$string = "Hello"
$string =+ " there"

在 Perl 中你可以这样做

my $string = "hello"
$string .= " there"

这似乎有点冗长

$string = $string + " there"

$string = "$string there"

【问题讨论】:

【参考方案1】:

实际上,您的操作员倒退了。应该是+=,而不是=+

$string = "Hello"
$string += " there"

下面是一个演示:

PS > $string = "Hello"
PS > $string
Hello
PS > $string += " there"
PS > $string
Hello there
PS >

但是,这是您可以做您想做的最快/最短的解决方案。

【讨论】:

好尴尬,我都没试过!【参考方案2】:

避免使用+= 构建字符串

至于using the increase assignment operator (+=) to create a collection,字符串也是相互的,因此使用increase assignment operator (+=) 构建字符串可能会变得非常昂贵,因为它将连接字符串并分配(复制!) 将其返回到变量中。相反,我建议使用 PowerShell pipeline 和 -Join operator 来构建您的字符串。 除了它更快之外,它实际上也更多DRY:

$String = 'Hello', 'there' -Join ' ' # Assigns: 'Hello there'

或者只是

-Join @('One', 'Two', 'Three') # Yields: 'OneTwoThree'

对于一些项目,它可能没有多大意义,但让我给你一个更常见的例子,创建一个格式化的数字列表,比如:

[Begin]
000001
000002
000003
[End]

你可以这样做:

$x = 3
$String = '[Begin]' + [Environment]::NewLine
for ($i = 1; $i -le $x; $i++)  $String += '0:000000' -f $i + [Environment]::NewLine 
$String += '[End]' + [Environment]::NewLine

但是,您实际上可以使用 PowerShell 方式进行操作:

$x = 3
$String = @(
    '[Begin]'
    for ($i = 1; $i -le $x; $i++)  '0:000000' -f $i 
    '[End]'
) -Join [Environment]::NewLine

性能测试

为了显示使用增加赋值运算符 (+=) 的性能下降,让我们将 $x 增加一个因子 1000 直到 20.000

1..20 | ForEach-Object 
    $x = 1000 * $_
    $Performance = @x = $x
    $Performance.Pipeline = (Measure-Command 
        $String1 = @(
            '[Begin]'
            for ($i = 1; $i -le $x; $i++)  '0:000000' -f $i 
            '[End]'
        ) -Join [Environment]::NewLine
    ).Ticks
    $Performance.Increase = (Measure-Command 
        $String2 = '[Begin]' + [Environment]::NewLine
        for ($i = 1; $i -le $x; $i++)  $String2 += '0:000000' -f $i + [Environment]::NewLine 
        $String2 += '[End]' + [Environment]::NewLine
    ).Ticks
    [pscustomobject]$Performance
 | Format-Table x, Increase, Pipeline, @n='Factor'; e=$_.Increase / $_.Pipeline; f='0.00' -AutoSize

结果:

    x Increase Pipeline Factor
    - -------- -------- ------
 1000   261337   252704   1,03
 2000   163596    63225   2,59
 3000   432524   127788   3,38
 4000   365581   137370   2,66
 5000   586370   171085   3,43
 6000  1219523   248489   4,91
 7000  2174218   295355   7,36
 8000  3148111   323416   9,73
 9000  4490204   373671  12,02
10000  6181179   414298  14,92
11000  7562741   447367  16,91
12000  9721252   486606  19,98
13000 12137321   551236  22,02
14000 14042550   598368  23,47
15000 16390805   603128  27,18
16000 18884729   636184  29,68
17000 21508541   708300  30,37
18000 24157521   893584  27,03
19000 27209069   766923  35,48
20000 29405984   814260  36,11

另见:PowerShell scripting performance considerations - String addition

【讨论】:

以上是关于PowerShell 中是不是有字符串连接快捷方式?的主要内容,如果未能解决你的问题,请参考以下文章

在 PowerShell 中使用分隔符连接部件的最佳方式

如何使用 PowerShell 创建快捷方式

powershell PowerShell:重新创建LastPass桌面快捷方式

如何编写使用快捷方式关闭 PowerShell 的 AHK 脚本?

powershell PowerShell:在“发送到”文件夹中创建“发送到”快捷方式。

powershell 发布/取消发布AppV快捷方式