获取动态创建的字符串长度

时间:2017-02-24 09:55:58

标签: powershell

让我们说我想做这样的事情:

$string = 'arbitrary string' # << is random
(Do-Something -Name ($string + (Get-Random)).Substring(0, [math]::Min(20, ??)

如何引用($string + (Get-Random))内表达式结果的当前长度?

当字符串短于20个字符

时使用Substring(0, 20)时失败
  

异常调用&#34;子串&#34;用&#34; 2&#34;参数:&#34;索引和长度   必须引用字符串中的位置。参数名称:长度&#34;

1 个答案:

答案 0 :(得分:4)

您必须将新字符串分配给变量:

Do-Something -Name ($s = $string + (Get-Random)).Substring(0, [math]::Min(20,$s.Length))

以上的简洁版本:

$Name = $string + (Get-Random)
if($Name.Length -gt 20){
    $Name = $Name.Substring(0, 20)
}
Do-Something -Name $Name

如评论中所述,您还可以从字符串中按索引选择前20个字符,然后再次与-join运算符(v3.0和更新)结合使用:

$Name = "$string$(Get-Random)"[0..19] -join ''

感觉活泼吗?使用正则表达式(作为suggested by wOxxOm):

$Name = "$string$(Get-Random)" -replace '^(.{20}).+','$1'

如果连接的字符串少于20个字符,则不会替换任何内容,否则整个字符串将匹配并被前20个字符替换

另一种方法是生成随机数X个数字,其中X为20 - $string.Length(仅当$string保证长度在2到19个字符之间时才有效):

$Name = "$string$(Get-Random -Min ('1' * (20 - $string.Length)) -Max ('9' * (20 - $string.Length)))"